我有一个星期的数字和年份,并希望本周的第一天从星期一开始。
如果上一年日期的星期开始日期(例如,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年以及其他类似情况下使此工作正常进行,以便在所有年份中保持一致?
我们非常感谢您的帮助。预先谢谢你。
答案 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年...