ISO-8601规定周数应形成为YYYY-W##
- 观察周数应为两位数,如01,02,......
SELECT cast(DATEPART(YYYY, CreationDate) as varchar) + '-W' +
cast(DATEPART(ISO_WEEK, GETDATE())`
问题在于这将周数提供为1,2,......
提取2020-W01的正确方法是什么,......
答案 0 :(得分:3)
SELECT cast(DATEPART(YYYY, CreationDate) as varchar) + '-W' + Right('0'+cast(DATEPART(ISO_WEEK,CreationDate) as Varchar),2)
答案 1 :(得分:3)
原始问题文本与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
;