You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用SQL查询指定日期区间内每日13:00-16:00的数据?

解决方案:仅用SQL实现日期区间内每日特定时段的数据查询

当然可以实现!你的基础查询语句只做了日期区间的过滤,但缺少了每日13:00-16:00的时段限制。我们只需要在WHERE条件中同时添加日期范围时段范围的判断即可,具体写法会根据你使用的数据库略有不同,下面给出几种常见数据库的实现方式:

核心逻辑

我们需要同时满足两个条件:

  • 数据的时间字段(假设为event_time,请替换为你表中的实际时间字段名)的日期部分落在2019-01-012019-01-10之间
  • 该时间字段的时间部分落在13:00:0016: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';

特殊场景说明

如果你的表中fromDatetoDate是每条数据的时间范围字段(比如一条数据代表某个时间段内的记录),需要判断该数据的时间范围与每日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

火山引擎 最新活动