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



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)

相关内容

最新更新