有没有办法匹配多个日期范围以包含在postgresql中的其他多个范围

时间:2017-09-14 20:56:27

标签: postgresql range inclusion

例如,我在数据库允许的范围 - (08:00-12:00),(12:00-15:00)和我想要测试的请求范围 - (09:00-14:00)。有没有办法理解我的测试范围包含在数据库的允许范围内。它可以分成更多部分,我只想知道我的范围是否完全适合数据库中的时间范围列表。

1 个答案:

答案 0 :(得分:0)

您没有提供表格结构,因此我不知道数据类型。我们假设这些是文本:

t=# select '(8:00, 12:30)' a,'(12:00, 15:00)' b,'(09:00, 14:00)' c;
       a       |       b        |       c
---------------+----------------+----------------
 (8:00, 12:30) | (12:00, 15:00) | (09:00, 14:00)
(1 row)

那你怎么做呢:

t=# \x
Expanded display is on.
t=# with d(a,b,c) as (values('(8:00, 12:30)','(12:00, 15:00)','(09:00, 14:00)'))
, w as (select '2017-01-01 ' h)
, timerange as (
select
  tsrange(concat(w.h,split_part(substr(a,2),',',1))::timestamp,concat(w.h,split_part(a,',',2))::timestamp) ta
, tsrange(concat(w.h,split_part(substr(b,2),',',1))::timestamp,concat(w.h,split_part(b,',',2))::timestamp) tb
, tsrange(concat(w.h,split_part(substr(c,2),',',1))::timestamp,concat(w.h,split_part(c,',',2))::timestamp) tc
from w
join d on true
)
select *, ta + tb glued, tc <@ ta + tb fits from timerange;
-[ RECORD 1 ]----------------------------------------
ta    | ["2017-01-01 08:00:00","2017-01-01 12:30:00")
tb    | ["2017-01-01 12:00:00","2017-01-01 15:00:00")
tc    | ["2017-01-01 09:00:00","2017-01-01 14:00:00")
glued | ["2017-01-01 08:00:00","2017-01-01 15:00:00")
fits  | t

首先你需要&#34;演员&#34;你的时间戳是时间戳,因为postgres中没有时间范围,所以我们一直都在同一天(w.h = 2017-01-01)并将a,b,c转换为ta,tb,tc,默认包括括号(完全适合我们的情况)。

然后使用union https://www.postgresql.org/docs/current/static/functions-range.html#RANGE-FUNCTIONS-TABLE运算符来获取&#34;粘合&#34;间隔

最后检查范围是否包含在<@运算符

的较大范围内