Postgresql

Postgres 發現一個日期範圍和其他日期範圍之間的差距

  • November 28, 2021

我的問題類似於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中新的多範圍數據類型正是所需要的。多範圍運算符允許拆分日期範圍。

Postgres 14 的發行說明:

這些類似於範圍數據類型,但它們允許指定多個、有序、不重疊的範圍。為每個範圍類型自動創建關聯的多範圍類型。

範例 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,int8rangedaterange都使用包含下限但不包括上限的規範形式;也就是說,[). 但是,使用者定義的範圍類型可以使用其他約定。

引用自:https://dba.stackexchange.com/questions/303223