SQL Server中如何实现以周四为周起始、周三为周结束的日期计算?
解决SQL Server中周四至周三周范围的计算问题
这个问题的核心是SQL Server默认的周起始规则(由@@DATEFIRST控制,通常默认是周日)和你需要的周四起始周不匹配,导致当日期是周四时,原代码会返回上周的周四。下面是两种可靠的解决方法:
方法1:不依赖@@DATEFIRST的通用计算(推荐)
这种方法完全不受服务器DATEFIRST设置的影响,兼容性最好:
WITH CurrentDateContext AS ( SELECT GETDATE() AS CurrentDate, -- 计算当前日期距离1900-01-01(周一)的天数偏移:0=周一,1=周二,2=周三,3=周四,4=周五,5=周六,6=周日 DATEDIFF(day, '1900-01-01', GETDATE()) % 7 AS DayOffset ) SELECT -- 计算当前周的周四 DATEADD(day, CASE WHEN DayOffset >= 3 THEN -(DayOffset - 3) -- 周四到周日:减去偏移差得到本周四 ELSE -(DayOffset + 4) -- 周一到周三:减去(偏移+4)天得到上周四 END, CurrentDate ) AS ThursdayOfCurrentWeek, -- 计算当前周的周三(周四加6天) DATEADD(day, 6, DATEADD(day, CASE WHEN DayOffset >= 3 THEN -(DayOffset - 3) ELSE -(DayOffset + 4) END, CurrentDate ) ) AS WednesdayOfCurrentWeek FROM CurrentDateContext;
测试你的例子:
- 当
CurrentDate是2021-09-29(周三),返回2021-09-23(周四)和2021-09-29(周三) - 当
CurrentDate是2021-09-30(周四),返回2021-09-30(周四)和2021-10-06(周三)
方法2:临时修改周起始日
如果你可以临时修改会话的DATEFIRST设置,也可以用更简洁的写法:
-- 设置周四为每周的第一天(DATEFIRST=5,因为周日=1,周一=2...周四=5) SET DATEFIRST 5; SELECT -- 获取当前周的第一天(周四) DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0) AS ThursdayOfCurrentWeek, -- 当前周的最后一天(周三,第一天加6天) DATEADD(day, 6, DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0)) AS WednesdayOfCurrentWeek; -- 可以改回默认设置(如果需要) SET DATEFIRST 7;
为什么原代码会出错?
你的原代码DATEADD(wk, DATEDIFF(wk, 0, GETDATE()), 3)是基于默认周起始日(周日)计算的:
DATEDIFF(wk, 0, GETDATE())会计算从1900-01-01到当前日期有多少个周边界(周日)DATEADD(wk, 上述周数, 0)得到的是当前默认周(周日起始)的周一,加3天是该周的周四——但当当前日期本身是周四时,这个默认周的起始是上周日,对应的周四自然就是上周四,和你的需求不符。
内容的提问来源于stack exchange,提问作者mons1998
相关产品推荐
相关产品推荐

