Sql server 需要每周和每年保存ISO_

Sql server 需要每周和每年保存ISO_,sql-server,tsql,Sql Server,Tsql,我需要在表中的两个日期之间拆分并保存ISO_周和年。 为了获得这些数据,我使用下面的查询 DECLARE @_start DATE = '2019-01-01' DECLARE @_end DATE = '2019-12-31' SELECT DATEPART(YEAR,dateadd(week, number, @_start)) AS YEAR ,DATEPART(ISO_WEEK,dateadd(week, number, @_start)) AS CW FROM (SELECT x.n

我需要在表中的两个日期之间拆分并保存ISO_周和年。 为了获得这些数据,我使用下面的查询

DECLARE @_start DATE = '2019-01-01'
DECLARE @_end DATE = '2019-12-31'

SELECT DATEPART(YEAR,dateadd(week, number, @_start)) AS YEAR
,DATEPART(ISO_WEEK,dateadd(week, number, @_start)) AS CW
FROM (SELECT x.number FROM master..spt_values x WHERE type = 'P' 
AND @_end >= dateadd(week, number, @_start)) date_part
这一逻辑在今年的最后一周失效,我将CW设为1,2019年设为1。但实际上,CW是1,年份是2020年

YEAR        CW
----------- -----------
2019        1
2019        2
 .          .
 .          .
2019        52
2019        1

有什么建议吗?

试试这个

DECLARE @_start DATE = '2019-01-01'
DECLARE @_end DATE = '2019-12-31'

SELECT  DATEPART(year, s.Sunday) AS YEAR
        , DATEPART(iso_week, s.Sunday) AS CW
FROM    (
        SELECT  DATEADD(week, x.number, DATEADD(day, 7 - (DATEPART(dw, @_start) + @@DATEFIRST - 1) % 7, @_start)) AS Sunday
        FROM    master..spt_values x
        WHERE   type = 'P'
        ) s
WHERE   @_end >= s.Sunday
这首先抵消了"你从下一个周日开始,然后循环所有周日


我们的想法是,在一年中。。。对于周日,DATEPARTISO_WEEK的回归并不那么令人惊讶,

似乎你最好还是有一张日历表。您得到的两个值是正确的;最后一行的日期是2019-12-31,是2019年,但它是ISO_第1周的一部分。我想保存该日历周所在的年份。2019年12月31日是2020年的第1个CW。顺便说一句,在阅读维基百科的iso周时,我发现:每一周的一年都是公历的一年,其中周四是星期四。因此,您可能需要调整上面的查询,使其基于周四而不是周日-DATEADDday,7。。。必须成为DATEADDday,4。。。等