2012-11-10 150 views

回答

4
SELECT cast(DATEPART(YYYY, CreationDate) as varchar) + '-W' + Right('0'+cast(DATEPART(ISO_WEEK,CreationDate) as Varchar),2) 
+0

這不會產生2021-01-01的正確結果。它返回2021-W53,它應該返回2020-W53。請參閱http://connect.microsoft.com/SQLServer/feedback/details/413279/datepart-iso-year-for-is-week – Mike

1

原來的問題文本涉及ISO_WEEK數量的簡單格式問題的正確途徑,但我覺得這裏有一個更大的問題年份的連接。簡單地連接DatePart YYYY和ISO_WEEK將在第1周和/或第53周的日子產生不正確的(或至少意外的)結果。顯着的日期如2014-12-31是第1周的一部分,但不是2014-W01。它是2015-W01的一部分。同樣,2016-01-01將成爲2015-W53的一部分,而不是2016-W53。爲了確定Iso Year-Week,必須對年進行修正以考慮到這一點:

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 
; 
相關問題