从 SQL Server 中的日期检索年份和周数

Jib*_*hew 3 sql sql-server sql-date-functions

yyyyww我正在尝试以 、等格式获取年份数和周数201901201905并且201911我正在使用此查询来执行此操作:

declare @BeginDate datetime

set @beginDate = '2019-02-07'

select  
     concat(datepart(year, @BeginDate), right('0' + convert(varchar, datepart(week, dateadd(day, -7 , @BeginDate))), 2)) 
Run Code Online (Sandbox Code Playgroud)

直到 2018 年 12 月,这种方式都运行良好。但是当我尝试这个日期时2019-01-07,它返回的201953结果不正确。但对于所有其他值,如 2019-01-14 等,它会正确获取周数。

那么如何才能准确获取全年的年周数字组合

DDS*_*DDS 6

您没有考虑“年周”定义:

根据维基百科: 第一年的一周是指包含该年第一个星期四的那一周,或者包含 1 月 4 日的那一周,或者从 12 月 29 日到 1 月 4 日之间开始的那一周。

因此,如果一年从第 52 或 53 周开始,则该周是上一年最后一周的尾数。

所以你有了:

set dateformat ymd 
set datefirst 1
declare @data as datetime
declare @year as int

set @data = cast('2017-01-01' as datetime)
set @year = case when datepart(iso_week,@data) >= 52 and month(@data) = 1 
                      then year(@data)-1 
                 when datepart(iso_week,@data) = 1 and month(@data) = 12 
                      then year(@data)+1
                      else year(@data) end

select concat (@year, right('0'+cast(datepart(iso_week,@data) as varchar(6)),2))
Run Code Online (Sandbox Code Playgroud)

结果是201652

编辑:更新为始终具有两位数的周数