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
相关产品推荐
相关产品推荐

