首页 > 解决方案 > 获取 12 月 31 日的正确周数

问题描述

在 SQL Server 中,我试图获取给定日期的周数(带有年份),欧洲风格,所以我使用DATEPARTwithISO_WEEK参数:

SELECT CAST(DATEPART(year, myDate) AS VARCHAR) + RIGHT('0' + CAST(DATEPART(ISO_WEEK, myDate) AS VARCHAR), 2);

这很好用,除了 2018 年 12 月 31 日,它是 2019 年的第一周,但由于我DATEPART分别使用一年和一周,这显然行不通。以下是 myDate 为 31-12-2018 的示例:

SELECT CAST(DATEPART(year, '31-12-2018') AS VARCHAR) + RIGHT('0' + CAST(DATEPART(ISO_WEEK, '31-12-2018') AS VARCHAR), 2);

上述查询返回“201801”。

有没有办法简单地获得 2018 年 12 月 31 日的 201901,而无需明确测试该日期?

标签: sql-servertsql

解决方案


查看可能的重复参考并稍微整理一下:

declare @d datetime = '2018-12-31';
select cast(year(dateadd(day, 26 - datepart(ISO_WEEK, @d), @d)) as varchar(4)) + right(('0' + cast(datepart(ISO_WEEK, @d) as varchar(2))), 2)

结果201901

测试代码:

select cast(ds.d as date) as 'date', cast(year(dateadd(day, 26 - datepart(ISO_WEEK, ds.d), ds.d)) as varchar(4)) + right(('0' + cast(datepart(ISO_WEEK, ds.d) as varchar(2))), 2) as "IsoWeek"
from (
    select dateadd(day, x.num, '2018-12-30') as d
    from (
        select h.num + d.num + s.num as num
        from (
            select 0 num union select 100 num union select 200 num union select 300 num
        ) h
        cross join (
            select 0 num union select 10 num union select 20 num union select 30 num
        ) d
        cross join (
            select 0 num union select 1 num union select 2 union select 3 num
        ) s
    ) x    
) ds
order by ds.d

这导致:

日期等周
2018-12-30 201852
2018-12-31 201901
2019-01-01 201901
2019-01-02 201901
2019-01-09 201902
2019-01-10 201902
2019-01-11 201902
2019-01-12 201902
2019-01-19 201903
2019-01-20 201903
2019-01-21 201904
2019-01-22 201904
2019-01-29 201905
2019-01-30 201905
2019-01-31 201905
2019-02-01 201905
2019-04-09 201915
2019-04-10 201915
2019-04-11 201915
2019-04-12 201915
2019-04-19 201916
2019-04-20 201916
2019-04-21 201916
2019-04-22 201917
2019-04-29 201918
2019-04-30 201918
2019-05-01 201918
2019-05-02 201918
2019-05-09 201919
2019-05-10 201919
2019-05-11 201919
2019-05-12 201919
2019-07-18 201929
2019-07-19 201929
2019-07-20 201929
2019-07-21 201929
2019-07-28 201930
2019-07-29 201931
2019-07-30 201931
2019-07-31 201931
2019-08-07 201932
2019-08-08 201932
2019-08-09 201932
2019-08-10 201932
2019-08-17 201933
2019-08-18 201933
2019-08-19 201934
2019-08-20 201934
2019-10-26 201943
2019-10-27 201943
2019-10-28 201944
2019-10-29 201944
2019-11-05 201945
2019-11-06 201945
2019-11-07 201945
2019-11-08 201945
2019-11-15 201946
2019-11-16 201946
2019-11-17 201946
2019-11-18 201947
2019-11-25 201948
2019-11-26 201948
2019-11-27 201948
2019-11-28 201948

推荐阅读