2017-09-14 46 views
0

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

+0

我的测试范围可以是(09:00-10:00) ,(10:00,14:00) –

+1

请** [编辑] **您的问题,并根据该数据添加一些示例数据和预期输出。 [**格式化文本**](http://stackoverflow.com/help/formatting)请,[**没有屏幕截图**](http://meta.stackoverflow.com/questions/285551/why-may -i-不上传图像-的代码上那么当灰化-A-问题/ 285557#285557)。 ** [**]您的问题 - 请勿**在论坛中发布代码或其他信息。 –

回答

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 

首先你需要以“铸造”你的时间戳记,存在的Postgres没有TIMERANGE,因此,我们采取所有时间都在同一天(w.h = 2017-01-01),并将a,b,c转换为ta,tb,tc,默认包括括号(这完全符合我们的情况)。

然后使用unionhttps://www.postgresql.org/docs/current/static/functions-range.html#RANGE-FUNCTIONS-TABLE操作得到“胶合”间隔

最后检查范围由较大的一个与操作者<@包含

+0

“*因为在postgres *中没有时间范围”,但是您可以非常容易地创建一个:'创建类型时间范围作为范围(子类型=时间);' –

+0

@a_horse_with_no_name谢谢 - 我将根据您建议的更新版本更新答案了解表格结构和来自OP的清晰样本 –

相关问题