Postgres tsrange,按日期和时间过滤

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Postgres tsrange,按日期和时间过滤相关的知识,希望对你有一定的参考价值。

我有一个events表,该表具有一个名为duration的字段,其类型为tsrange,并捕获该事件的开始和结束时间。我想要的是能够过滤特定日期范围内的所有事件,然后按时间过滤那些事件。因此,例如,用户应该能够过滤在(包括)timestamp12-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:按日期时间优化查询

postgres:是不是按返回顺序应用 where 子句过滤器

如何在Postgres中按年月按最大(日期)组获取行?

Django 仅使用 Sqlite 按距离过滤(无 GeoDjango、PostGres、MySQL、GIS)

Django 按时间过滤日期时间字段,与日期无关

在 Gatsby 和 Contentful 中按日期过滤