Oracle查询:筛选指定日期范围且时间在22:00-07:00的数据
Oracle查询:筛选指定日期范围且时间在晚10点至早7点的数据
要在原有日期筛选基础上,进一步过滤出时间处于22:00到次日07:00的数据,可通过提取IMPORT_START字段的小时部分,结合逻辑判断实现。由于该时间段跨午夜,需用OR连接两个时间区间条件:
优化后的查询语句
SELECT IMPORT_START FROM PROTOCOLS WHERE IMPORT_START >= DATE '2022-01-01' AND IMPORT_START < DATE '2023-01-01' -- 注意:改用<而非<=,确保包含2022-12-31当天的所有时间 AND ( EXTRACT(HOUR FROM IMPORT_START) >= 22 OR EXTRACT(HOUR FROM IMPORT_START) <= 7 );
关键说明
- 日期范围修正:原查询中
IMPORT_START <= DATE '2022-12-31'会排除2022-12-31当天00:00之后的所有数据,改用IMPORT_START < DATE '2023-01-01'可完整包含2022年全年的所有时间点。 - 时间筛选逻辑:
EXTRACT(HOUR FROM IMPORT_START)用于提取日期字段中的24小时制小时数- 晚10点及以后对应小时数≥22,早7点及以前对应小时数≤7,两者用OR连接覆盖跨午夜的时间段
替代实现方式(字符串转换)
若偏好字符串格式判断,也可使用TO_CHAR函数:
SELECT IMPORT_START FROM PROTOCOLS WHERE IMPORT_START >= DATE '2022-01-01' AND IMPORT_START < DATE '2023-01-01' AND ( TO_CHAR(IMPORT_START, 'HH24') >= '22' OR TO_CHAR(IMPORT_START, 'HH24') <= '07' );
不过从性能角度,EXTRACT的数值对比比字符串转换更高效,推荐优先使用前者。
内容的提问来源于stack exchange,提问作者Tom el Safadi
相关产品推荐
相关产品推荐

