所以這個想法很簡單:
我有一個包含 astart_date和end_datecolumns 的表。
我也有 2 個引數 ( initial_date, final_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'
uj5u.com熱心網友回復:
使用日期范圍重疊運算子&&:
select *
from my_table
where daterange(start_date, end_date) && daterange('2022-05-19', '2022-05-24')
或符合標準的overlaps:
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', '[]'),
閱讀檔案:
- 范圍/多范圍函式和運算子。
- 日期/時間函式和運算子。
如果找到匹配項而不是回傳行,是否可以回傳真/假布林值?
您可以使用 Postgres 布爾聚合函式以優雅的方式做到這一點:
select bool_or((start_date, end_date) overlaps ('2022-05-19', '2022-05-24'))
from my_table
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/480571.html
標籤:sql PostgreSQL
