如何检查某个事件时间是否在 PostgreSQL 的时间范围内?
How to check if a certain event hour is between a range of hours in PostgreSQL?
我有轮班table像这样(简化)
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 记录?
在 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 以更轻松地测试查询。
我有轮班table像这样(简化)
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 记录?
在 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 以更轻松地测试查询。