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

 

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;



 

原文地址:https://www.cnblogs.com/DKSoft/p/1444682.html