如何用SQL查询指定日期区间内每日13:00-16:00的数据?
解决方案:仅用SQL实现日期区间内每日特定时段的数据查询
当然可以实现!你的基础查询语句只做了日期区间的过滤,但缺少了每日13:00-16:00的时段限制。我们只需要在WHERE条件中同时添加日期范围和时段范围的判断即可,具体写法会根据你使用的数据库略有不同,下面给出几种常见数据库的实现方式:
核心逻辑
我们需要同时满足两个条件:
- 数据的时间字段(假设为
event_time,请替换为你表中的实际时间字段名)的日期部分落在2019-01-01至2019-01-10之间 - 该时间字段的时间部分落在
13:00:00至16:00:00之间
MySQL 实现
SELECT * FROM your_table WHERE -- 筛选日期区间 DATE(event_time) BETWEEN '2019-01-01' AND '2019-01-10' -- 筛选每日13:00-16:00的时段 AND TIME(event_time) >= '13:00:00' AND TIME(event_time) <= '16:00:00';
PostgreSQL 实现
SELECT * FROM your_table WHERE event_time::date BETWEEN '2019-01-01' AND '2019-01-10' AND event_time::time >= '13:00:00' AND event_time::time <= '16:00:00';
SQL Server 实现
SELECT * FROM your_table WHERE CAST(event_time AS DATE) BETWEEN '2019-01-01' AND '2019-01-10' AND CAST(event_time AS TIME) >= '13:00:00' AND CAST(event_time AS TIME) <= '16:00:00';
特殊场景说明
如果你的表中fromDate和toDate是每条数据的时间范围字段(比如一条数据代表某个时间段内的记录),需要判断该数据的时间范围与每日13:00-16:00有重叠,那么可以调整条件为:
-- 以MySQL为例 SELECT * FROM your_table WHERE -- 数据的时间范围与目标日期区间有交集 fromDate <= '2019-01-10 16:00:00' AND toDate >= '2019-01-01 13:00:00' -- 同时确保重叠部分落在每日13:00-16:00之间 AND EXISTS ( SELECT 1 FROM ( -- 生成目标区间内的每一天 SELECT DATE_ADD('2019-01-01', INTERVAL n DAY) AS day_date FROM (SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS nums ) AS days WHERE -- 数据时间范围与当天13:00-16:00有重叠 fromDate <= CONCAT(day_date, ' 16:00:00') AND toDate >= CONCAT(day_date, ' 13:00:00') );
这个写法会找出所有在2019-01-01至2019-01-10期间,至少有一天的13:00-16:00与数据的时间范围重叠的记录。
内容的提问来源于stack exchange,提问作者Ayiko Nishimura




