Массив дат в этом случае очень неудобен. Используйте массивы daterange
и оператор удержания <@
, например ::100100
with my_table(id, created_at) as (
values
(1, '2015-01-10'::timestamp),
(2, '2016-05-10'),
(3, '2017-10-10')
)
select *
from my_table
where created_at::date <@ any(array[daterange('2015-01-06','2015-02-10'), daterange('2017-10-05','2017-10-11')])
id | created_at
----+---------------------
1 | 2015-01-10 00:00:00
3 | 2017-10-10 00:00:00
(2 rows)
Если вы абсолютно хотите использовать массив дат (честно говоря, я так не думаю), используйте эту функцию для преобразования его в массив дат:
create or replace function date_pairs_to_ranges(date[])
returns daterange[] language sql as $$
select array_agg(daterange(d1, d2))
from unnest($1) with ordinality as u1(d1, o1)
join unnest($1) with ordinality as u2(d2, o2)
on o1/ 2* 2 < o1 and o2 = o1+ 1
$$;
with my_table(id, created_at) as (
values
(1, '2015-01-10'::timestamp),
(2, '2016-05-10'),
(3, '2017-10-10')
)
select *
from my_table
where created_at::date <@ any(date_pairs_to_ranges(array['2015-01-06','2015-02-10','2017-10-05','2017-10-11']::date[]))