检查 Postgres 中 2 个日期范围之间的交集
Check for intersection between 2 dateranges in Postgres
所以思路很简单:
我有一个 table 包含 start_date
和 end_date
列。
我还有2个参数(initial_date
, final_date
).
我想检查我的日期范围 [initital_date, final_date]
在 [start_date, end_date]
日期范围的任何可能组合中是否有交集。
例如,如果我有以下 table :
id | start_date | end_date
1 '2022-05-23' '2022-05-26'
2 '2022-05-25' '2022-05-30'
3 '2022-05-01' '2022-05-20'
并且如果initial_date = 2022-05-19
并且final_date = 2022-05-24
我想要的输出是:
id | start_date | end_date
1 '2022-05-23' '2022-05-26'
3 '2022-05-01' '2022-05-20'
使用日期范围重叠运算符&&
:
select *
from my_table
where daterange(start_date, end_date) && daterange('2022-05-19', '2022-05-24')
或 standard-compliant overlaps
:
select *
from my_table
where (start_date, end_date) overlaps ('2022-05-19', '2022-05-24')
中测试
注意。以上两种方案都假设每个时间段代表half-open区间start
<= time
< end
。在第一个变体中,您可以按如下方式关闭范围的末尾:
daterange(start_date, end_date, '[]') && daterange('2022-05-19', '2022-05-23', '[]'),
阅读文档:
is it possible to return a true/false boolean if a match is found
instead of returning rows?
您可以使用 Postgres 布尔聚合函数以优雅的方式做到这一点:
select bool_or((start_date, end_date) overlaps ('2022-05-19', '2022-05-24'))
from my_table
所以思路很简单:
我有一个 table 包含 start_date
和 end_date
列。
我还有2个参数(initial_date
, final_date
).
我想检查我的日期范围 [initital_date, final_date]
在 [start_date, end_date]
日期范围的任何可能组合中是否有交集。
例如,如果我有以下 table :
id | start_date | end_date
1 '2022-05-23' '2022-05-26'
2 '2022-05-25' '2022-05-30'
3 '2022-05-01' '2022-05-20'
并且如果initial_date = 2022-05-19
并且final_date = 2022-05-24
我想要的输出是:
id | start_date | end_date
1 '2022-05-23' '2022-05-26'
3 '2022-05-01' '2022-05-20'
使用日期范围重叠运算符&&
:
select *
from my_table
where daterange(start_date, end_date) && daterange('2022-05-19', '2022-05-24')
或 standard-compliant overlaps
:
select *
from my_table
where (start_date, end_date) overlaps ('2022-05-19', '2022-05-24')
中测试
注意。以上两种方案都假设每个时间段代表half-open区间start
<= time
< end
。在第一个变体中,您可以按如下方式关闭范围的末尾:
daterange(start_date, end_date, '[]') && daterange('2022-05-19', '2022-05-23', '[]'),
阅读文档:
is it possible to return a true/false boolean if a match is found instead of returning rows?
您可以使用 Postgres 布尔聚合函数以优雅的方式做到这一点:
select bool_or((start_date, end_date) overlaps ('2022-05-19', '2022-05-24'))
from my_table