我有一个周号和年份,希望一周的第一天从周一开始。
如果上一年日期的周开始日期(例如,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年。。。