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



我正在尝试以201901201905201911等格式获取年号和周数yyyyww,我正在使用这个查询来做到这一点:

declare @BeginDate datetime
set @beginDate = '2019-02-07'
select  
     concat(datepart(year, @BeginDate), right('0' + convert(varchar, datepart(week, dateadd(day, -7 , @BeginDate))), 2)) 

这在2018年12月之前一直运作良好。但是当我尝试这个日期2019-01-07时,它返回了不正确的201953。但是对于所有其他值,例如 2019-01-14 等,它会正确获取周数。

那么我怎样才能在一年中准确地获取年周数字组合

您没有考虑"年周"的定义:

根据维基百科:第一年的一周是包含一年中第一个星期四的一周,或者包含 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))

这样做的结果是201652

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

您可以使用以下代码尝试

SELECT concat(year('2019-01-07'),Format(datepart(day, datediff(day, 0, '2019-01-07')/7 * 7)/7 + 1 , '00') )

输出

201902

SELECT concat(year('2019-01-01'),Format(DATEPART( wk, '2019-01-01')  , '00') )

输出

201901

通常,计算日期标准部分的更清晰方法是使用标准函数。因此,我建议将DATEPART与RIGHT结合使用,以确保我们从右边开始两个字符:

DECLARE @DT AS DATE = '2019-01-07'
SELECT  CONCAT(year(@DT),
        RIGHT('0'+CONVERT(VARCHAR(2), DATEPART(wk, @DT)), 2))

下面的代码块不是确切的解决方案,但它绝对可以帮助您。

.SQL

DECLARE @Dt datetime
SELECT @Dt='02-21-2008'
SELECT DATEPART( wk, @Dt)

最新更新