SQL查询多个不连续时间区间无结果的解决方法
问题根因
当前SQL的所有过滤条件全用AND串联,逻辑要求executedAt必须同时满足「早于2022-05-18 12:40:00」和「晚于2022-05-18 13:00:00」,这类条件本身互斥,不存在任何时间值能同时满足所有串联的约束,自然查不出结果。
解决方案
方案1:离散区间用OR拼接
如果只需要查询几个固定的、不连续的时间窗口,把每个窗口的上下界用括号归为一组,不同窗口的条件组之间用OR连接即可,修正后代码:
SELECT * FROM `xxxx.yyyy.data` WHERE (executedAt > "2022-05-18 12:00:00" AND executedAt < "2022-05-18 12:40:00") OR (executedAt > "2022-05-18 13:00:00" AND executedAt < "2022-05-18 13:40:00") OR (executedAt > "2022-05-18 14:00:00" AND executedAt < "2022-05-18 14:40:00")
需要新增其他时间窗口时,按相同格式追加OR条件组就行。
方案2:规则化窗口用时间函数判断
如果你的需求是所有小时段固定截取前N分钟(比如每小时前40分钟、前10分钟),不需要限定某几个特定小时,可以直接提取时间的分钟分量做判断,后续调整窗口长度只需要改一个数值,不用逐行写区间:
-- 示例为截取每小时前40分钟数据,要改成10分钟窗口直接把40替换成10即可 SELECT * FROM `xxxx.yyyy.data` WHERE -- 适配你当前用的BigQuery语法 EXTRACT(MINUTE FROM executedAt) < 40 -- 若需要限定日期范围,可追加条件,比如只查2022-05-18的数据: AND DATE(executedAt) = "2022-05-18"
如果是其他SQL引擎,替换成对应时间函数即可:MySQL用MINUTE(executedAt) < 40,PostgreSQL同样支持EXTRACT写法,逻辑完全一致。
小提示:如果
executedAt是带时区的时间字段,记得统一比较值和字段的时区,避免出现时间匹配偏差。
内容的提问来源于stack exchange,提问作者Llyrzala
相关产品推荐
相关产品推荐

