ISO -8601指出,每周的数字应为YYYY-W##
-观察,一周的数字应为两个数字为01,02,...
SELECT cast(DATEPART(YYYY, CreationDate) as varchar) + '-W' +
cast(DATEPART(ISO_WEEK, GETDATE())`
问题在于,这将一周的编号为1,2,...
提取2020-W01的正确方法是什么,...
原始问题文本与ISO_Week号码的简单格式问题有关,但是我觉得本年度串联的串联存在一个更大的问题。简单地将datePart Yyyy和ISO_Week串联会在第1周和/或53的天数中产生不正确(或至少意外)的结果。尤其是2014-12-31之类的日期是第1周的一部分,但不是2014-W01。它是2015-W01的一部分。同样,2016-01-01将是2015-W53的一部分,而不是2016-W53。为了确定年度ISO周周,必须纠正一年以考虑到这一点:
With
Dates (Date) As (
Select Convert( date, N'2014-12-31' )
Union All Select Convert( date, N'2015-01-01' )
Union All Select Convert( date, N'2015-12-31' )
Union All Select Convert( date, N'2016-01-01' )
)
Select
src.Date
, Concat( Case
When DatePart( Month, src.Date ) = 12 And DatePart( ISO_WEEK, src.Date ) = 1 Then DatePart( Year, src.Date ) + 1
When DatePart( Month, src.Date ) = 1 And DatePart( ISO_WEEK, src.Date ) > 50 Then DatePart( Year, src.Date ) - 1
Else DatePart( Year, src.Date )
End, N'-W', Right( Concat( N'00', DatePart( ISO_WEEK, src.Date ) ), 2 ) ) As IsoYearWeek
From
Dates src
;
SELECT cast(DATEPART(YYYY, CreationDate) as varchar) + '-W' + Right('0'+cast(DATEPART(ISO_WEEK,CreationDate) as Varchar),2)