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

SQL中如何筛选前一日16点至当日4点的表数据

问题原因

你原来的DATEPART(hh, dateColumn) >= 16 AND DATEPART(hh, dateColumn) <= 4使用了逻辑与,不存在任意一个小时能同时满足大于等于16且小于等于4,因此查询不会返回任何结果。

解决方案

推荐优先使用直接计算时间边界的写法,该写法不需要对筛选字段做函数运算,可以正常命中字段索引,查询效率更高:

WHERE
  -- 前一日16点作为起始时间
  dateColumn >= DATEADD(HOUR, 16, CAST(CAST(GETDATE() AS DATE) AS DATETIME) - 1)
  -- 当日4点作为结束时间
  AND dateColumn <= DATEADD(HOUR, 4, CAST(CAST(GETDATE() AS DATE) AS DATETIME))

如果需要按日期+小时拆分判断,可使用逻辑或拆分两种符合要求的场景:

WHERE
  -- 限定整体时间范围仅包含前一日和当日,避免其他日期的匹配数据干扰
  dateColumn >= DATEADD(DAY, -1, CAST(GETDATE() AS DATE))
  AND dateColumn < DATEADD(DAY, 1, CAST(GETDATE() AS DATE))
  AND (
    -- 匹配前一日16点及以后的数据
    (CAST(dateColumn AS DATE) = DATEADD(DAY, -1, CAST(GETDATE() AS DATE)) AND DATEPART(HOUR, dateColumn) >= 16)
    -- 匹配当日4点及以前的数据
    OR (CAST(dateColumn AS DATE) = CAST(GETDATE() AS DATE) AND DATEPART(HOUR, dateColumn) <= 4)
  )

内容的提问来源于stack exchange,提问作者fault_final

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:15:06