sql - 从 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 年和其他此类情况下正常工作,以便在所有年份保持一致?
非常感谢任何帮助。先感谢您。
解决方案
我认为您可以通过将日期转换为星期偏移量然后转换回日期来完成您正在寻找的内容。转换为周取决于开始日期的工作日。
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 年...
推荐阅读
- sapui5 - 获取当前重点元素
- swift - Swift WatchOS 错误:控制器的接口描述(“图像”)中的未知属性
- symfony - 配置键“page_range”分页
- c# - 如何使用 C# 驱动程序在 MongoDb 中嵌套在字典(文档数组)中的列表中插入值?
- microsoft-dynamics - 其中哪一个更好更快?
- java - 三元运算符的奇怪行为
- amazon-web-services - ELB目标组-ECS启动任务时不会自动添加目标
- amazon-web-services - 在 AWS { "errorMessage": "Unable to import module 'lambda'" } (S3+Lambda) 中出现此错误
- oauth-2.0 - 多个 URL 上的身份服务器
- java - 我的 SharedPreferences 值由于某种原因没有通过