Postgresql
Postgres 發現一個日期範圍和其他日期範圍之間的差距
我的問題類似於https://stackoverflow.com/a/41267928/2585154,但在我的情況下,我需要將日期範圍除以多個日期範圍,而不僅僅是一個。
在我的情況下,還保證“要分割的日期範圍”不會相互重疊。
範例 1:
拆分日期範圍:2021-01-01 2021-12-31
要除以 (1) 的日期範圍:
- 2021-03-01 2021-06-02
我想得到以下輸出:
- 2021-01-01 2021-02-28
- 2021-06-03 2021-12-31
範例 2:
拆分日期範圍:2021-01-01 2021-12-31
要除以 (2) 的日期範圍:
- 2021-03-01 2021-06-02
- 2021-07-01 2021-12-30
我想得到以下輸出:
- 2021-01-01 2021-02-28
- 2021-06-03 2021-06-30
- 2021-12-31 2021-12-31
Postgres 14中新的多範圍數據類型正是您所需要的。多範圍運算符允許拆分日期範圍。
- 添加對多範圍數據類型的支持(Paul Jungwirth、Alexander Korotkov)
這些類似於範圍數據類型,但它們允許指定多個、有序、不重疊的範圍。為每個範圍類型自動創建關聯的多範圍類型。
範例 1:
test=> SELECT datemultirange '{[2021-01-01,2022-01-01)}' test-> - datemultirange '{[2021-03-01,2021-06-02]}' AS result; result --------------------------------------------------- {[2021-01-01,2021-03-01),[2021-06-03,2022-01-01)} (1 row)
範例 2:
test=> SELECT datemultirange '{[2021-01-01,2021-12-31]}' test-> - datemultirange '{[2021-03-01,2021-06-02], [2021-07-01,2021-12-30]}' AS result; result --------------------------------------------------------------------------- {[2021-01-01,2021-03-01),[2021-06-03,2021-07-01),[2021-12-31,2022-01-01)} (1 row)
db<>在這裡擺弄
我在範例中使用了多範圍文字(常量)。
請注意,
[2021-01-01,2022-01-01)
and[2021-01-01,2021-12-31]
是相同日期範圍的兩個等效語法變體。第一個變體是規範形式。手冊:內置的範圍類型
int4range
,int8range
和daterange
都使用包含下限但不包括上限的規範形式;也就是說,[)
. 但是,使用者定義的範圍類型可以使用其他約定。