Postgresql
日期範圍內的數組元素?
我有一個日期數組,我想知道數組中的任何元素是否出現在給定的日期範圍內。
例如(虛擬碼 - 不起作用,為便於閱讀而包裝):
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)
有人對此有任何指示嗎?任何幫助表示讚賞。
我有一個日期數組,我想知道數組中的任何元素是否出現在給定的日期範圍內。
根據查詢,您可以使用
- joanolo 在他的回答
bool_or
中提到的行聚合。- 或者,您可以
ANY
與 contains 運算符一起使用@>
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