如何避免使用UNION ALL实现连续多天同一时间区间的数据过滤?
替代UNION ALL的连续多天指定时间段过滤方法
当然存在不需要用UNION ALL的替代方案,以下是几种更简洁的写法,适配不同数据库场景:
方法一:日期范围+时间范围组合过滤
直接限定总日期区间,同时匹配每天的目标时间段,适合日期范围明确的场景:
SELECT insert_datetime FROM table WHERE -- 覆盖所有目标日期(左闭右开,包含2022-09-02和09-03全天) insert_datetime >= '2022-09-02' AND insert_datetime < '2022-09-04' -- 匹配每天01:00-01:10的时间部分 AND TIME(insert_datetime) BETWEEN '01:00:00' AND '01:10:00';
注:不同数据库的时间提取函数略有差异:SQL Server用CAST(insert_datetime AS TIME),Oracle用TO_CHAR(insert_datetime, 'HH24:MI:SS'),可根据实际数据库调整。
方法二:生成日期序列关联查询
如果数据库支持生成日期序列(如PostgreSQL、MySQL 8.0+),可以动态生成目标日期,再关联表筛选时间段,适合日期范围较大的场景:
-- PostgreSQL示例 SELECT t.insert_datetime FROM table t JOIN generate_series( '2022-09-02'::DATE, '2022-09-03'::DATE, '1 day'::INTERVAL ) AS dates(d) ON t.insert_datetime >= d + '01:00:00'::TIME AND t.insert_datetime < d + '01:10:00'::TIME;
-- MySQL 8.0+示例 SELECT t.insert_datetime FROM table t JOIN ( SELECT DATE_ADD('2022-09-02', INTERVAL seq DAY) AS target_date FROM seq_0_to_1 -- 生成0到1的序列,对应2天 ) AS dates ON t.insert_datetime >= CONCAT(dates.target_date, ' 01:00:00') AND t.insert_datetime < CONCAT(dates.target_date, ' 01:10:00');
方法三:提取时分字段判断
通过提取小时和分钟字段,直接匹配目标区间,逻辑直观:
SELECT insert_datetime FROM table WHERE insert_datetime >= '2022-09-02' AND insert_datetime < '2022-09-04' AND EXTRACT(HOUR FROM insert_datetime) = 1 AND EXTRACT(MINUTE FROM insert_datetime) BETWEEN 0 AND 9;
内容的提问来源于stack exchange,提问作者Cgra
相关产品推荐
相关产品推荐

