SQL查询需求:获取上周日3:00至下周日2:59的时间范围
精准获取周日至周日的时间区间(3:00 AM - 2:59 AM)
需求说明
需获取最近的周日凌晨3:00到下一个周日凌晨2:59的时间区间,要求:
- 无论哪天执行查询,区间都准确匹配:比如8/29(周四)执行时,区间为
8/25/2024 3:00 AM-9/1/2024 2:59 AM;9/1(周日)执行时,区间为9/1/2024 3:00 AM-9/8/2024 2:59 AM。 - 兼容不同地区的周起始日设置(
@@DATEFIRST为1即周一为周首,或7即周日为周首),确保周日执行时区间仍为周日至周日。
修正后的SQL查询
SELECT StartDate = DATEADD(HOUR, 3, StartDateRaw), EndDate = DATEADD(MINUTE, 179, DATEADD(DAY, 7, StartDateRaw)) FROM ( -- 获取最近的周日(当天为周日则取当天,否则取上周日)的零时间点 SELECT StartDateRaw = CASE WHEN DATEPART(dw, GETDATE()) = IIF(@@DATEFIRST = 7, 1, 7) THEN CAST(GETDATE() AS DATE) ELSE DATEADD(DAY, -(DATEPART(dw, GETDATE()) - IIF(@@DATEFIRST = 7, 1, 7) + 7) % 7, CAST(GETDATE() AS DATE) ) END ) AS DateCalculations
逻辑解释
- StartDateRaw计算:
- 通过
IIF(@@DATEFIRST = 7, 1, 7)适配不同地区的周日标识:当@@DATEFIRST=7(周日为周首)时,DATEPART(dw)返回1代表周日;当@@DATEFIRST=1(周一为周首)时,DATEPART(dw)返回7代表周日。 - 如果当前日期是周日,直接取当天的零时间点;否则计算需要往前推的天数,定位到上周日的零时间点。
- 通过
- StartDate:在
StartDateRaw基础上加3小时,得到周日凌晨3:00。 - EndDate:将
StartDateRaw加7天(得到下周日的零时间点),再加179分钟(即2小时59分),精准得到下周日凌晨2:59。
内容的提问来源于stack exchange,提问作者852post
相关产品推荐
相关产品推荐

