我正在尝试以201901
、201905
、201911
等格式获取年号和周数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)