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

如何避免使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:05:33