计算日期段内有几个星期几(SQL, Delphi) ,日期段内有几个星期天

简介: declare @StartDate datetimedeclare @EndDate datetimedeclare @WeekDay INT, @WeekNum INT set @StartDate = '2009-10-4'  set @EndDate = '2009-10-25' ...

 

declare @StartDate datetime
declare @EndDate datetime
declare @WeekDay INT, @WeekNum INT

set @StartDate = '2009-10-4' 
set @EndDate = '2009-10-25'

set @StartDate = '2009-10-1' 
set @EndDate = '2009-10-2'

set @StartDate = '2009-10-3' 
set @EndDate = '2009-10-4'

SET @WeekDay = 1   --星期天

SELECT @WeekNum=datediff(day
                 ,case
                     when DATEPART(weekday,@StartDate) = @WeekDay then @StartDate - 1
                     else @StartDate
                  end
                 ,case
                      when DATEPART(weekday,@EndDate) = @WeekDay then @EndDate + 1
                      else @EndDate
                  end
             ) / 7

IF DATEPART(weekday,@StartDate)=@WeekDay
  SELECT @WeekNum = @WeekNum + 1
ELSE IF (@EndDate > @StartDate) AND (DATEPART(weekday,@EndDate) = @WeekDay)
  SELECT @WeekNum = @WeekNum + 1

SELECT @WeekNum




-----Delphi

function WeekDayCount(pvDate1, pvDate2: TDateTime; pvWeekDay: Integer): Integer;
var
  lvDate1, lvDate2: TDateTime;
  lvWeekNum: Real;
  lvDay: Integer;
begin
  lvDate1 := Trunc(pvDate1);
  lvDate2 := Trunc(pvDate2);

  if DayOfWeek(pvDate1) = pvWeekDay then lvDate1 := IncDay(lvDate1, -1);
  if DayOfWeek(lvDate2) = pvWeekDay then lvDate2 := IncDay(lvDate2, +1);

  //相差的天数是是多少个星期
  Result := Trunc(WeekSpan(lvDate1, lvDate2));

  //如果最后一天是那天则加1,注意是pvDate2不是lvDate2
  if DayOfWeek(pvDate1) = pvWeekDay then Inc(Result)
  else if pvDate2 > pvDate1 then
    if DayOfWeek(pvDate2) = pvWeekDay then Inc(Result);
end;



type

  TWeekDay = 1..7;

  TWeekDays = set of TWeekDay;

function WeekDayCountEx(pvDate1, pvDate2: TDateTime; pvWeekDays: TWeekDays):
  Integer;
var
  lvDate1, lvDate2, lvTempDate: TDateTime;
begin
  lvDate1 := Trunc(pvDate1);
  lvDate2 := Trunc(pvDate2);
  lvTempDate := lvDate1;
  Result := 0;
  while lvTempDate <= lvDate2 do
  begin
    if DayOfWeek(lvTempDate) in pvWeekDays then Inc(Result);
    lvTempDate := IncDay(lvTempDate, 1);
  end;
end;



 

 

目录
相关文章
|
3月前
|
SQL 存储 缓存
SQL计算班级语文平均分:详细步骤与技巧
在数据库管理和分析中,经常需要计算某个班级在特定科目上的平均分
|
3月前
|
SQL 开发框架 .NET
sql server日期时间函数
sql server日期时间函数
63 2
|
4月前
|
SQL 存储 并行计算
Lindorm Ganos 一条 SQL 计算轨迹
Lindorm Ganos 针对轨迹距离计算场景提供了内置函数 ST_Length_Rows,结合原生时空二级索引和时空聚合计算下推技术,能够高效过滤数据并并行执行运算任务。该方案通过主键索引和时空索引快速过滤数据,并利用多Region并行计算轨迹点距离,适用于车联网等场景。具体步骤包括根据车辆识别代码和时间戳过滤数据、范围过滤轨迹点以及并行计算距离。使用限制包括只支持点类型列聚合运算及表中轨迹点需按顺序排列等。测试结果显示,Lindorm Ganos 在不同数据量下均能实现秒级响应。
44 3
|
3月前
|
SQL 关系型数据库 MySQL
SQL日期函数
SQL日期函数
|
5月前
|
Java 应用服务中间件 Maven
从零到英雄:一步步构建你的首个 JSF 应用程序,揭开 JavaServer Faces 的神秘面纱
【8月更文挑战第31天】JavaServer Faces (JSF) 是一种强大的 Java EE 标准,用于构建企业级 Web 应用。它提供了丰富的组件库和声明式页面描述语言 Facelets,便于开发者快速开发功能完善且易于维护的 Web 应用。本文将指导你从零开始构建一个简单的 JSF 应用,包括环境搭建、依赖配置、Managed Bean 编写及 Facelets 页面设计。
120 0
|
5月前
|
SQL 关系型数据库 MySQL
【超全整理】SQL日期与时间函数大汇总会:MySQL与SQL Server双轨对比教学,助你轻松搞定时间数据处理难题!
【8月更文挑战第31天】本文介绍了在不同SQL数据库系统(如MySQL、SQL Server、Oracle)中常用的日期与时间函数,包括DATE、NOW()、EXTRACT()、DATE_ADD()、TIMESTAMPDIFF()及日期格式化等,并提供了具体示例。通过对比这些函数在各系统中的使用方法,帮助开发者更高效地处理日期时间数据,满足多种应用场景需求。
683 0
|
5月前
|
SQL 数据挖掘 数据库
SQL计算班级语文平均分:详细步骤与技巧
在数据库管理中,经常需要统计和查询各种汇总信息,如班级某科目的平均分
|
7月前
|
SQL 分布式计算 大数据
MaxCompute产品使用问题之odps sql 底层计算框架是MR吗
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
6月前
|
SQL 数据处理
SQL 能力问题之合并两个存在交叉的日期区间,如何解决
SQL 能力问题之合并两个存在交叉的日期区间,如何解决
|
8月前
|
SQL HIVE
【Hive SQL 每日一题】统计用户连续下单的日期区间
该SQL代码用于统计用户连续下单的日期区间。首先按`user_id`和`order_date`分组并去除重复,然后使用`row_number()`标记行号,并通过`date_sub`与行号计算潜在的连续日期。接着按用户ID和计算后的日期分组,排除连续订单数少于2的情况,最后提取连续下单的起始和结束日期。输出结果展示了用户连续下单的日期范围。
271 0