SQL周末12小时窗口计算异常:周日无法返回当周时段
问题分析与修正方案
原SQL的核心问题是窗口起始点计算逻辑错误:你通过DATEADD(DAY, 1, Starting)将基准从当周周一移到了周二,再叠加153小时(6天9小时)后,最终得到的是下周周一9:00-21:00,完全偏离了周末窗口的需求。尽管你设置了DATEFIRST 1(周一为一周首日),周日仍属于当前周,但原逻辑的计算结果始终指向下周周一,只是你误判了周六执行的结果。
修正方案(二选一)
方案1:匹配你描述的“起始于当周周一次日起第153小时”(实际对应周日9:00-21:00)
去掉多余的DATEADD(DAY, 1, Starting),直接从当周周一叠加小时数:
SET DATEFIRST 1; WITH Current AS ( SELECT DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0) AS Starting -- 当前周的周一 ) SELECT [Date], [priority], [Account] FROM [table_1] WHERE Date >= (SELECT DATEADD(HOUR, 153, Starting) FROM Current) -- 周日9:00 AND Date <= (SELECT DATEADD(HOUR, 165, Starting) FROM Current) -- 周日21:00 AND priority = 'P1'
方案2:针对典型周末窗口(周六9:00-21:00)调整小时数
如果你的实际需求是周六的12小时窗口,将小时数调整为129(周一0点+5天9小时)到141(129+12):
SET DATEFIRST 1; WITH Current AS ( SELECT DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0) AS Starting -- 当前周的周一 ) SELECT [Date], [priority], [Account] FROM [table_1] WHERE Date >= (SELECT DATEADD(HOUR, 129, Starting) FROM Current) -- 周六9:00 AND Date <= (SELECT DATEADD(HOUR, 141, Starting) FROM Current) -- 周六21:00 AND priority = 'P1'
两种方案都能保证:无论你在周六还是周日执行查询,都会返回当前周的周末窗口数据,不会跳转到下周。
内容的提问来源于stack exchange,提问作者Santosh Pal
相关产品推荐
相关产品推荐

