ISO-8601規定,週數將被格式化爲YYYY-W##
- 觀察到週數應該是兩位數字爲01,02,...如何在SQL Server中將日期轉換爲ISO-8601星期數字格式?
SELECT cast(DATEPART(YYYY, CreationDate) as varchar) + '-W' +
cast(DATEPART(ISO_WEEK, GETDATE())`
的問題是,這給週數1,2,...
什麼是提取2020-W01,...
ISO-8601規定,週數將被格式化爲YYYY-W##
- 觀察到週數應該是兩位數字爲01,02,...如何在SQL Server中將日期轉換爲ISO-8601星期數字格式?
SELECT cast(DATEPART(YYYY, CreationDate) as varchar) + '-W' +
cast(DATEPART(ISO_WEEK, GETDATE())`
的問題是,這給週數1,2,...
什麼是提取2020-W01,...
SELECT cast(DATEPART(YYYY, CreationDate) as varchar) + '-W' + Right('0'+cast(DATEPART(ISO_WEEK,CreationDate) as Varchar),2)
原來的問題文本涉及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
;
這不會產生2021-01-01的正確結果。它返回2021-W53,它應該返回2020-W53。請參閱http://connect.microsoft.com/SQLServer/feedback/details/413279/datepart-iso-year-for-is-week – Mike