【问题标题】:How to check if a certain event hour is between a range of hours in PostgreSQL?如何检查某个事件时间是否在 PostgreSQL 的时间范围之间?
【发布时间】:2015-07-26 08:58:09
【问题描述】:

我有一张这样的轮班表(简化版)

 id | hr_start |  hr_end
----+----------+----------
  1 | 08:00:00 | 15:59:59
  2 | 16:00:00 | 21:59:59
  3 | 22:00:00 | 03:59:59
  4 | 04:00:00 | 07:59:59

我有需要检查轮班的警报事件(时间戳)。

例如,如果警报事件发生在 14:34,则分配班次 1,如果事件发生在 23:20,则分配班次 3,依此类推。

我的第一个方法是这样的:

SELECT id 
FROM shifts 
WHERE hr_start < '09:23:00':TIME AND hr_end > '09:23:00':TIME;

是的,这适用于 id 1,2 和 4,但不是 3。

然后我尝试这样的 BETWEEN 查询:

SELECT id 
FROM shifts 
WHERE '09:23:00':TIME BETWEEN r_start AND hr_end;

结果相同

如何检索 22:00 到 03:59 范围内发生的事件的 ID = 3 记录?

My attempts in this sqlfiddle

【问题讨论】:

    标签: postgresql time overlap between


    【解决方案1】:

    在 WHERE 条件下使用 CASE:

    SELECT id 
    FROM shifts
    CROSS JOIN (SELECT '23:00:00'::TIME AS event) sub
    WHERE 
        CASE WHEN hr_start <= hr_end THEN hr_start <= event AND hr_end >= event
        ELSE hr_start <= event OR hr_end >= event END;
    

    注意。我添加了 CROSS JOIN 以更轻松地测试查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 2016-10-23
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      相关资源
      最近更新 更多