我只想找到一种方法来获取两个日期范围之间的开始周和结束周列表。
例如如果我调用函数或存储过程说
GetWeekDates('2014年3月21日','2014年3月21日')
然后我应该得到一张桌子:
Start Week | End Week
17 March 2014 | 23 Mar 2014
24 March 2014 | 30 Mar 2014
....
我不想使用CURSOR或WHILE Loop。
我应该导致的任何方向?
我只是在考虑现有代码。
亲切的问候, 上午
答案 0 :(得分:2)
只要间隔为38年或更短,这将有效。它将提供更好的性能,并且不依赖于服务器的本地设置。
此设置将导致脚本返回错误的结果:
set datefirst 1
select * from dbo.fnGetWeeksBetweenDates('2014-03-21','2014-03-21')
这意味着您的本地设置目前与您的需求相冲突,您的代码正在补偿。
这是脚本。由于性能原因,脚本限制为38年(我发现你不太可能需要更大的间隔)。将它延长到更多年将相当容易。
DECLARE @FromDate DATE = '2014-03-21'
DECLARE @ToDate DATE = '2014-03-24'
SELECT @fromdate = dateadd(day, datediff(day, 0, @FromDate)/7*7, 0),
@todate = dateadd(day, datediff(day, 0, @ToDate)/7*7, 6)
SELECT dateadd(d, number * 7, @fromdate) Start_Week,
dateadd(d, number * 7 + 6, @fromdate) End_Week
FROM
master..spt_values
WHERE type = 'P' and
@todate >= dateadd(d, number * 7, @fromdate)
结果:
Start_Week End_Week
2014-03-17 2014-03-23
2014-03-24 2014-03-30
答案 1 :(得分:1)
我最终通过WITH语句,它比任何其他方式快得多;重构任务完成了
CREATE FUNCTION fnGetWeeksBetweenDates
(
@FromDate DATETIME,
@ToDate DATETIME
) RETURNS @tbl TABLE (StartWeek date, EndWeek date)
AS BEGIN
DECLARE @TOTALWEEK INT
SET @FromDate = DATEADD(DAY,-1*DATEPART(dw,@FromDate)+2,@FromDate)
SET @TOTALWEEK = DATEDIFF(ww,@FromDate,@ToDate)+1;
WITH weekdays (StartWeek, EndWeek) as
(
select top (@TOTALWEEK) StartWeek = DateAdd(Week, ROW_NUMBER()
OVER (ORDER BY object_id)-1, @FromDate),
EndWeek = DateAdd(Week, ROW_NUMBER()
OVER (ORDER BY object_id)-1, @FromDate)
FROM SYS.all_objects
)
insert into @tbl
select StartWeek, DATEADD(day, 6, EndWeek) as EndWeek From weekdays;
RETURN
END;
您可以通过以下方式致电:
select * from dbo.fnGetWeeksBetweenDates('21 MAR 2014', '21 MAR 2015')