我希望从1月1日到今年的第52周获得一年的完整ISO周刊。
我希望每周都能获得startdate和enddate。
我的脚本在这里,但我没有得到我想要的输出
脚本:
Declare @starttime datetime
Declare @endtime datetime
Set @starttime = '2015-01-01 10:50:29.293'
Set @endtime = '2015-12-31 10:50:29.293'
declare @time datetime
while @endtime > @starttime
begin
print DATEPART(Week,@starttime)
print @starttime
set @time = DATEADD(DAY, 6,@starttime)
If @time<@endtime
Begin
print @time
print DATEPART(Week,@time)
set @starttime = DATEADD(DAY, 1,@time)
End
Else
begin
print @endtime
print DATEPART(Week,@endtime)
set @endtime = @starttime
End
end
输出:
1 --> this is the week of the @Starttime
Jan 1 2015 10:50AM -->@starttime
Jan 7 2015 10:50AM -->@endtime
2 --> this is the week of the endtime
...............
51
Dec 17 2015 10:50AM
Dec 23 2015 10:50AM
52
52
Dec 24 2015 10:50AM
Dec 30 2015 10:50AM
53
直到今年年底。
我希望我的输出像这样
样品:
1 --> this is the week of the @Starttime
Jan 1 2015 10:50AM -->@starttime
Jan 3 2015 10:50AM -->@endtime
1 --> this is the week of the @endtime
我希望我的开始时间是我一周的第一天,而我的结束时间是本周的最后一天,直到一年结束。
你能帮我解决这个问题吗?
答案 0 :(得分:2)
您可以使用DATEPART
和WEEKDAY
来获取一周中的某一天,然后使用递归CTE来获得后续几周。像这样的东西
DECLARE @dtstart DATETIME= '20150101'
DECLARE @dtend DATETIME= '20151231'
;WITH CTE AS
(
SELECT 1 as WeekNo, @dtstart weekstart,DATEADD(d,6-DATEPART(WEEKDAY,@dtstart),@dtstart) weekend
UNION ALL
SELECT CTE.WeekNo + 1 as WeekNo, DATEADD(d,1,CTE.weekend),CASE WHEN DATEADD(d,7,CTE.weekend) < @dtend THEN DATEADD(d,7,CTE.weekend) ELSE @dtend END
FROM CTE WHERE DATEADD(d,1,CTE.weekend) < @dtend
)
SELECT * FROM CTE;