2016-09-30 3 views
0

У меня есть календарь с событиями: календарь всегда имеют начальную точку и конечную точку (например, 29.04.2014 до 09.6.2014)Postgresql диапазон дат

События показаны с этого диапазона дат:

AND DATE(event_from) >= DATE(?) //29.04.2014 
AND DATE(event_to) <= DATE(?) //09.6.2014 

но если событие начинается 28.04 и заканчивается 10.6.2014 его хочет показан в календаре

Как я могу показать это событие, если оно превышает диапазон, но также остается в пределах

Благодаря Клину:

Все вместе

AND (daterange(DATE(event_from), DATE(event_to)) && daterange(DATE(?), DATE(?)) OR( DATE(event_from) >= DATE(?) AND DATE(event_to) <= DATE(?) ) )

ответ

4

Используйте тип daterange и overlap operator:

with ranges(event_from, event_to) as (
values 
    ('2016-04-01'::date, '2016-06-01'::date), 
    ('2016-01-01', '2016-03-01'), 
    ('2016-05-01', '2016-05-15') 
) 

select * 
from ranges 
where daterange(event_from, event_to) && daterange('2016-05-01', '2016-05-31'); 

event_from | event_to 
------------+------------ 
2016-04-01 | 2016-06-01 
2016-05-01 | 2016-05-15 
(2 rows) 
+0

поблагодарить Вас за решение, но не может изменить тип данных столбца – Froxz

+0

Вы DON» t должен. Используйте 'daterange' только в предложении' where', как в примере. – klin

+0

с использованием 'daterange (DATE (event_from), DATE (event_to)) && daterange (DATE ('2016-05-01'), DATE ('2016-05-31'))' Разрешил, но не получал только записи однодневное мероприятие. – Froxz

Смежные вопросы