请告诉我如何在Postgresql中实现简单的时间范围工作。我想执行如下查询:
SELECT user_id
FROM user_logs
WHERE login_time_range BETWEEN '20:00' AND '02:00'
注意,我不是在寻找datetime
类型。我也知道tsrange
也不适合我的需要。
在上面的查询中,我想将login_time_range存储为开始和结束小时的范围。
例如:[01:00, 02:30)
稍后我想查询检查天气login_time_range是否落入WHERE
子句的范围。
创建您自己的时间范围类型:
create type timerange as range (subtype = time);
create table user_logs
(
...,
login_time_range timerange
);
则可以在该列上使用所有范围类型操作符。
但是,这将不正确处理跨越午夜的范围,如您的示例20:00 - 02:00。
更好的方法可能是使用两列:一个start_time和一个duration:
create table user_logs
(
...,
login_time time,
login_duration interval
);
然后您可以使用当前日期(或任何您想要的日期)来检测"午夜交叉:
select current_date + login_time as login_start_time,
current_date + login_time + duration as login_end_time