首页 > 解决方案 > 从 SQL 中的周数和年份获取周开始日期

问题描述

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

如果上一年日期的一周开始日期(例如,2018 年 12 月 31 日与 2019 年 1 月 1 日在同一周),我还想排除该周,所以在这种情况下,我想要从 1 月 7 日(星期一)开始的周开始日期),2019 年为 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 年和其他此类情况下正常工作,以便在所有年份保持一致?

非常感谢任何帮助。先感谢您。

标签: sqldatetsqlweek-number

解决方案


我认为您可以通过将日期转换为星期偏移量然后转换回日期来完成您正在寻找的内容。转换为周取决于开始日期的工作日。

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 年...


推荐阅读