计算SQL Server 2005中几天之间的周数

时间:2011-05-24 19:13:16

标签: sql sql-server-2005

我在这里再次寻求帮助。这就是我想要做的。我有一个函数或sp,它有3个参数。 startdate, enddate,dayofweek(m,t,w等)需要计算开始日期和结束日期之间的周数。

例如,如果我将startday=2011-05-02enddate=2011-05-10dayofweek作为星期二传递,那么它应该计为2,如果我在星期三通过dayofweek,那么它应该计为1。

我能够使用此代码,有没有更好的方法来做到这一点? ClosingStartDate根据使用的dayofweek调整到正确的开始日期。所以基本上,代码在runningdate添加1周,并根据使用的周调整运行日期。

没有while..loop的任何其他方法。???

declare @NoofPeriods int
declare @runningdate datetime

 set @runningdate = @ClosingStartDate
 set @NoofPeriods=0
 while (@runningdate <= @NextStatementClosingdate)
  begin
    set @NoofPeriods=@NoofPeriods+1
    set @runningdate = Dateadd(day,7,@runningdate)
  end

3 个答案:

答案 0 :(得分:5)

它已内置于SQL 2005中。

SELECT DATEDIFF(week, @startdate, @enddate)

答案 1 :(得分:2)

我可能没有使用SQL Server语法,但这样的逻辑应该可行。基本上使用modulo-7算法来确定您在期间开始时有多少“奇数”天数,以及这些天数是否包括您选择的工作日之一(由dayofweek确定)。

@diffInDays = SELECT DATEDIFF(day, @startdate, @enddate)

@startDateDay = SELECT DATEPART(weekday, @startdate)

set @diffInWholeWeeks = @diffInDays / 7
set @diffRemainderDays = @diffInDays % 7

if @diffRemainderDays >= ( ( @dayofweek - @startDateDay ) % 7 )
  begin
    set @extraWeek = 1
  end
else
  begin
    set @extraWeek = 0
  end

set @answer = @diffInWholeWeeks + @extraWeek

答案 2 :(得分:1)

@slothrop的答案几乎已经死了,所以我将基于该代码并提出答案。

好的评论错了(请忽略):


因为天数是1-7而不是0-6,我们需要考虑它。我通过在第二个模数之后减去一个来做到这一点。我没有测试过所有场景,但它似乎有效。


令我感到困惑的是本周的转变。添加7到dayofweek以确保mod工作。

这应该有效,

--Setup
DECLARE @dayofweek int = 4
DECLARE @startdate datetime = '5/2/2011'
DECLARE @enddate datetime = '5/10/2011'

--Solution
DECLARE @diffInDays int = DATEDIFF(day, @startdate, @enddate);
DECLARE @startDateDay int = DATEPART(weekday, @startdate);
DECLARE @extraWeek int = 0;

DECLARE @diffInWholeWeeks int = @diffInDays / 7
DECLARE @diffRemainderDays int = @diffInDays % 7

if @diffRemainderDays >= ( ( @dayofweek + 7 - @startDateDay ) % 7 )
    set @extraWeek = 1

DECLARE @answer int = @diffInWholeWeeks + @extraWeek

SELECT @answer 

注意:我不确定2005年是否支持声明的内联设置。如果是这样,只需使用SET或SELECT语句来设置值。