我有一个像这样的转换表(简化)
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记录?
答案 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以便更轻松地测试查询。