我在这里再次寻求帮助。这就是我想要做的。我有一个函数或sp,它有3个参数。 startdate, enddate,
和dayofweek
(m,t,w等)需要计算开始日期和结束日期之间的周数。
例如,如果我将startday=2011-05-02
,enddate=2011-05-10
和dayofweek
作为星期二传递,那么它应该计为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
答案 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语句来设置值。