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

问题描述

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

如果上一年日期的星期开始日期(例如,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',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',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年以及其他类似情况下使此工作正常进行,以便在所有年份中保持一致?

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

解决方法

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

对于2019

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

select @sys_wk=datediff(wk,@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,0) as date) yr_wk_start;

结果

yr_wk_start
2023-01-09

它也适用于2024年...