You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 06:32:32