在SQL中从星期数和年份获取星期开始日期

时间:2020-08-25 12:21:27

标签: sql date tsql week-number

我有一个星期的数字和年份,并希望本周的第一天从星期一开始。

如果上一年日期的星期开始日期(例如,2018年12月31日)与2019年1月1日位于同一周,我还想排除星期,因此,在这种情况下,我希望从7日开始2019年1月(星期一)为2019年。

当前,我正在尝试使用此SQL代码从星期一获取星期开始日期

DECLARE @y NVARCHAR(100) = '2019', 
        @w INT = 1;

SELECT 
  [WeekStartDate] = DATEADD(wk,DATEDIFF(wk,7,@y) + (@w),7);

  --2019-01-07 00:00:00.000 -- returns this date which is correct.

我获得了正确的“周开始日期”,直到2022年,但是当我尝试2023年时,2024出了问题。我希望年份= 2023和周= 1的周开始日期从'2023-01-02'(星期一)开始,而2024年和周= 1的周开始日期从'2024-01-01'(星期一)开始,等等,但在接下来的几年中我得到了不同的结果,如下所示和说明。

  DECLARE @y NVARCHAR(100) = '2023', 
        @w INT = 1;

SELECT 
  [WeekStartDate] = DATEADD(wk,DATEDIFF(wk,7,@y) + (@w),7);

  --2023-01-09 00:00:00.000 - returns this date which is incorrect 
  --2023-01-02 00:00:00.000 - I want this date to be Week Start Date, not 2023-01-09
    

DECLARE @y NVARCHAR(100) = '2024', 
        @w INT = 1;

SELECT 
  [WeekStartDate] = DATEADD(wk,DATEDIFF(wk,7,@y) + (@w),7);

  --2024-01-08 00:00:00.000, - returns this date which is incorrect
  --2024-01-01 00:00:00.000 - I want this date to be Week Start Date, not 2024-01-08

要在2023年,2024年以及其他类似情况下使此工作正常进行,以便在所有年份中保持一致?

我们非常感谢您的帮助。预先谢谢你。

1 个答案:

答案 0 :(得分:0)

我认为您可以通过将日期转换为星期偏移量,然后再转换回日期来完成所需的操作。转换为星期取决于开始日期的星期几。

对于2019

declare 
  @yr           int=2019;
declare
  @dt           date=datefromparts(@yr, 1, 1),
  @sys_wk       int,
  @dt_from_wk   date;

select @sys_wk=datediff(wk, 0, @dt);
select cast(dateadd(wk, @sys_wk+1, 0) as date) yr_wk_start;

结果

yr_wk_start
2019-01-07

2023年

declare 
  @yr           int=2023;
declare
  @dt           date=datefromparts(@yr, 1, 1),
  @sys_wk       int,
  @dt_from_wk   date;

select @sys_wk=datediff(wk, 0, @dt);
select cast(dateadd(wk, @sys_wk+1, 0) as date) yr_wk_start;

结果

yr_wk_start
2023-01-09

它也适用于2024年...