2016-09-30 4 views
0

ich einen Kalender mit Veranstaltungen haben: Kalender immer einen Startpunkt und Endpunkt haben (zB bis 2014.06.09 29.04.2014)Postgresql Datumsbereich

Ereignisse werden aus diesem Datumsbereich gezeigt:

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

aber wenn Ereignis 28.04 und endet 2014.10.06 beginnt es in Kalender

gezeigt werden sollen Wie kann ich zeigen dieses Ereignis, wenn es den Bereich überschreitet, bleibt aber auch in Bereich

Dank klin:

Alle zusammen

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

Antwort

4

Verwenden Sie den Typ daterange und 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

danken Ihnen für Lösung, kann aber nicht den Datentyp Spalte ändern – Froxz

+0

Sie don‘ Ich muss. Verwenden Sie 'datarange' nur in' where', genau wie im Beispiel. – klin

+0

mit 'daterange (DATE (event_from), DATUM (event_to)) && daterange (DATUM ('2016-05-01'), DATUM ('2016-05-31'))' Gelöst es aber nicht Datensätze, die nur Ein-Tages-Event. – Froxz