Postgres tsrange,按日期和时间过滤
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Postgres tsrange,按日期和时间过滤相关的知识,希望对你有一定的参考价值。
我有一个events
表,该表具有一个名为duration
的字段,其类型为tsrange
,并捕获该事件的开始和结束时间。我想要的是能够过滤特定日期范围内的所有事件,然后按时间过滤那些事件。因此,例如,用户应该能够过滤在(包括)timestamp
至12-15-2019
之间以及9PM播放的所有事件。为此,用户提交一个日期范围,该日期范围过滤该日期范围内的所有事件:
12-17-2019
在以上WHERE lower(duration)::date <@ '[start, finish]'::daterange
和start
是用户提交的参数。
然后,我想通过特定时间(例如, 9PM,基本上只显示开始时间和结束时间之间为9PM的事件。
因此,如果我有下表:
finish
并且用户提交了id duration
--- ------------------------------------
A 2019-12-21 19:00...2019-12-22 01:00
B 2019-12-17 16:00...2019-12-17 18:00
C 2019-12-23 19:00...2019-12-23 21:00
D 2019-12-23 19:00...2019-12-24 01:00
E 2019-12-27 14:00...2019-12-27 16:00
到2019-12-21
的日期范围,那么事件B将被过滤掉。然后,用户提交时间9:00 PM(21:00),在这种情况下,将返回A,C和D。
编辑
我可以使用以下命令使其正常工作:
2019-12-27
上面的21:00是用户数据,但似乎有点破旧
用户输入WHERE duration @> (lower(duration)::date || ' 21:00:00')::timestamp
表示他感兴趣
from 2019-12-21 to 2019-12-27 at 21:00
因此,您应该检查select generate_series(timestamp '2019-12-21 21:00', '2019-12-27 21:00', '1 day') as t
t
---------------------
2019-12-21 21:00:00
2019-12-22 21:00:00
2019-12-23 21:00:00
2019-12-24 21:00:00
2019-12-25 21:00:00
2019-12-26 21:00:00
2019-12-27 21:00:00
(7 rows)
列是否包含时间戳之一:
duration
select distinct e.*
from events e
cross join generate_series(timestamp '2019-12-21 21:00', '2019-12-27 21:00', '1 day') as t
where duration @> t
id | duration
----+-----------------------------------------------
A | ["2019-12-21 19:00:00","2019-12-22 01:10:00")
C | ["2019-12-23 19:00:00","2019-12-23 21:10:00")
D | ["2019-12-23 19:00:00","2019-12-24 01:10:00")
(3 rows)
包含晚上9点的时间戳。当且仅当晚上9点在开始的第一天或晚上9点第二天是范围的一部分。
您可以使用它来写您的条件。
示例:
tsrange
是一项测试,是否lower(r)::date + TIME '21:00' <@ r OR
(lower(r)::date + 1) + TIME '21:00' <@ r
包含晚上9点的时间戳记
以上是关于Postgres tsrange,按日期和时间过滤的主要内容,如果未能解决你的问题,请参考以下文章
postgres:是不是按返回顺序应用 where 子句过滤器