如何使用sql server获取ISOweek以及全年每周的开始和结束日期

时间:2015-04-21 04:24:44

标签: sql sql-server sql-server-2008 date datetime

我希望从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

我希望我的开始时间是我一周的第一天,而我的结束时间是本周的最后一天,直到一年结束。

你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

您可以使用DATEPARTWEEKDAY来获取一周中的某一天,然后使用递归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;