如何在SQL Server中正确地将日期转换为ISO-8601周数字格式?

时间:2012-11-10 13:27:51

标签: sql sql-server datepart

ISO-8601规定周数应形成为YYYY-W## - 观察周数应为两位数,如01,02,......


SELECT cast(DATEPART(YYYY, CreationDate) as varchar) + '-W' + 
       cast(DATEPART(ISO_WEEK, GETDATE())`

问题在于这将周数提供为1,2,......

提取2020-W01的正确方法是什么,......

2 个答案:

答案 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
;