ISO-8601 ではYYYY-W##
、週番号は 01、02、... のように 2 桁である必要があることに注意してください。
SELECT cast(DATEPART(YYYY, CreationDate) as varchar) + '-W' +
cast(DATEPART(ISO_WEEK, GETDATE())`
問題は、これが週番号を 1、2、... として与えることです。
2020-W01の正しい抽出方法とは・・・
ISO-8601 ではYYYY-W##
、週番号は 01、02、... のように 2 桁である必要があることに注意してください。
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 週の日付に対して誤った (または少なくとも予想外の) 結果が得られます。2015-W01の一部です。同様に、2016-01-01 は 2016-W53 ではなく 2015-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
;
SELECT cast(DATEPART(YYYY, CreationDate) as varchar) + '-W' + Right('0'+cast(DATEPART(ISO_WEEK,CreationDate) as Varchar),2)