从SQL中的周数和年中获取周开始日期



我有一个周号和年份,希望一周的第一天从周一开始。

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

目前,我正在尝试使用此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年和其他此类情况下实现这一点,使其在所有年份保持一致?

非常感谢您的帮助。提前谢谢。

我认为您可以通过将日期转换为周偏移量,然后再转换回日期来完成您想要的任务。转换为周取决于开始日期的工作日。

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

相关内容