sql - 检查 Postgres 中 2 个日期范围之间的交集

标签 sql postgresql

所以这个想法非常简单:

我有一个包含 start_dateend_date 列的表格。

我还有 2 个参数(initial_datefinal_date)。

我想检查我的日期范围[initital_date, Final_date][start_date, end_date] 日期范围的任何可能组合内是否有交集。

例如,如果我有下表:

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')

或符合标准的重叠:

select *
from my_table
where (start_date, end_date) overlaps ('2022-05-19', '2022-05-24')

db<>fiddle.中进行测试

注意。上述两种解决方案都假设每个时间段代表半开区间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 bool 聚合函数以一种优雅的方式做到这一点:

select bool_or((start_date, end_date) overlaps ('2022-05-19', '2022-05-24'))
from my_table

关于sql - 检查 Postgres 中 2 个日期范围之间的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72347804/

相关文章:

.net - 是否有用于 SQL 或 MySQL 等的 "object database"插件?

sql - SSIS 序列容器事务选项

postgresql - 如何在安装时修复 Rust 柴油 cli 链接 libpq.lib 错误

postgresql - 通过 PG-Promise 初始化 Postgresql 数据库时遇到问题

postgresql - 使用 docker-compose 运行时,Postgresql 以信号 11 终止

java - java 中文本字段的准备语句

python - Pandas DataFrame.to_sql() 错误 - 并非所有参数都在字符串格式化期间转换

sql - oracle - 需要提交哪些语句?

ruby-on-rails - 如何在 Ruby on Rails 中构建一个查询,该查询仅加入一个 has_many 关系的最大值并在该关系上包含一个选择过滤器?

windows - 如何启动psql.exe