如何检查PostgreSQL中特定事件小时是否在一个小时的范围内?

时间:2015-07-26 08:58:10

标签: postgresql time overlap between

我有一个像这样的转换表(简化)

 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;

是的,这对ids 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

1 个答案:

答案 0 :(得分:3)

在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以便更轻松地测试查询。