Postgresql

日期範圍內的數組元素?

  • August 29, 2019

我有一個日期數組,我想知道數組中的任何元素是否出現在給定的日期範圍內。

例如(虛擬碼 - 不起作用,為便於閱讀而包裝):

SELECT ARRAY['2017-01-01'::DATE, '2017-02-03'::DATE] && 
   daterange('2017-01-01', '2017-01-31', '[]');

這個例子試圖展示的(雖然它不起作用)是我的日期數組和日期範圍之間的值是否存在重疊。

理想情況下,我可以用集合來做到這一點,並確定兩者之間是否存在聯合,但似乎不可能將 daterange 對象轉換為任何東西。

我確實設法讓這個工作,但我不知道如何隨後減少行:

SELECT daterange('2017-01-01', '2017-01-31', '[]') @> 
   unnest(ARRAY ['2017-01-01' :: DATE, '2016-07-30' :: DATE]);

這會返回多行:

?column?
----------
t
f
(2 rows)

有人對此有任何指示嗎?任何幫助表示讚賞。

我有一個日期數組,我想知道數組中的任何元素是否出現在給定的日期範圍內。

根據查詢,您可以使用

SELECT daterange('2017-01-01', '2017-01-31', '[]')  @> 
 ANY(ARRAY['2017-01-01'::date, '2017-02-03'::date]);

SELECT daterange('2017-01-01', '2017-01-31', '[]')  @> 
 ANY(ARRAY['2016-01-02'::date, '2016-01-09'::date]);

您可以使用聚合函式bool_or來實現您正在尋找的內容:

SELECT
   bool_or(date_range @> a_date) AS some_of_the_dates_lies_within_range
FROM
   (
   SELECT
       unnest(ARRAY['2017-01-01'::DATE, '2017-02-03'::DATE]) AS a_date, 
       daterange('2017-01-01', '2017-01-31', '[]') AS date_range
   ) AS s0

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