2016-09-30 87 views
0

我有一個事件日曆: 日曆總是有一個開始點和結束點(例如29.04.2014,直到2014年6月9日)PostgreSQL的日期範圍

事件從該日期範圍顯示:

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

但如果事件開始28.04,結束2014年6月10日希望它顯示在日曆

我怎麼能證明這個事件,如果超出這個範圍,而且保持在範圍

由於克林:

總之

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

回答

4

使用類型daterangeoverlap 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

的數據類型不得不。就像在這個例子中一樣,只在'where'子句中使用'daterange'。 – klin

+0

使用'daterange(DATE(event_from),DATE(event_to))&& daterange(DATE('2016-05-01'),DATE('2016-05-31'))'解決了它,但沒有得到只是記錄一天的活動。 – Froxz