2017-09-14 2 views
0

übereinstimmen Zum Beispiel habe ich in der Datenbank erlaubt Bereiche - (08: 00-12: 00), (12: 00-15: 00) und angefordert Bereich, den ich testen möchte - (09: 00-14: 00). Gibt es eine Möglichkeit zu verstehen, dass mein Testbereich in den erlaubten Bereich in der Datenbank eingeschlossen ist? Es kann in noch mehr Teilen aufgeteilt werden, ich möchte nur wissen, ob mein Bereich vollständig in die Liste der Zeitbereiche in der Datenbank passt.Gibt es eine Möglichkeit, mehrere Datumsbereiche für die Aufnahme in mehrere Bereiche in postgresql

+0

mein Testbereich sein kann enthalten ist (09: 00-10: 00) , (10:00, 14:00) –

+1

Bitte ** [EDIT] ** Ihre Frage und fügen Sie einige Beispieldaten und die erwartete Ausgabe basierend auf diesen Daten hinzu. [** Formatierter Text **] (http://stackoverflow.com/help/formatting) bitte, [** keine Screenshots **] (http://meta.stackoverflow.com/questions/285551/why-may -I-nicht-Upload-Bilder-of-Code-auf-so-wenn-eine Frage zu stellen/285557 # 285557). ** [Bearbeiten] ** Ihre Frage - tun ** nicht ** Postleitzahl oder zusätzliche Informationen in Kommentaren. –

Antwort

0

Sie stellen keine Tabellenstruktur bereit, daher habe ich keine Ahnung vom Datentyp. diese sind Texte Nehmen wir an:

t=# select '(8:00, 12:30)' a,'(12:00, 15:00)' b,'(09:00, 14:00)' c; 
     a  |  b  |  c 
---------------+----------------+---------------- 
(8:00, 12:30) | (12:00, 15:00) | (09:00, 14:00) 
(1 row) 

dann, wie Sie es tun können:

t=# \x 
Expanded display is on. 
t=# with d(a,b,c) as (values('(8:00, 12:30)','(12:00, 15:00)','(09:00, 14:00)')) 
, w as (select '2017-01-01 ' h) 
, timerange as (
select 
    tsrange(concat(w.h,split_part(substr(a,2),',',1))::timestamp,concat(w.h,split_part(a,',',2))::timestamp) ta 
, tsrange(concat(w.h,split_part(substr(b,2),',',1))::timestamp,concat(w.h,split_part(b,',',2))::timestamp) tb 
, tsrange(concat(w.h,split_part(substr(c,2),',',1))::timestamp,concat(w.h,split_part(c,',',2))::timestamp) tc 
from w 
join d on true 
) 
select *, ta + tb glued, tc <@ ta + tb fits from timerange; 
-[ RECORD 1 ]---------------------------------------- 
ta | ["2017-01-01 08:00:00","2017-01-01 12:30:00") 
tb | ["2017-01-01 12:00:00","2017-01-01 15:00:00") 
tc | ["2017-01-01 09:00:00","2017-01-01 14:00:00") 
glued | ["2017-01-01 08:00:00","2017-01-01 15:00:00") 
fits | t 

müssen Sie zuerst auf „werfen“ Ihre Zeit zeitzustempeln, da es keine Timerange in Postgres ist, so nehmen wir Gleicher Tag für alle Zeiten (w.h = 2017-01-01) und konvertieren a, b, c zu ta, tb, tc mit Standard inklusive Klammern (was völlig unserem Fall entspricht).

dann unionhttps://www.postgresql.org/docs/current/static/functions-range.html#RANGE-FUNCTIONS-TABLE Operator verwenden, um "verleimt" interval

schließlich prüfen, ob der Bereich, der durch die größeren mit <@ Operator

+0

"* da es in postgres keinen Zeitbereich gibt *" aber man kann sehr einfach einen erstellen: 'create type timerange als range (subtype = time);' –

+0

@a_horse_with_no_name danke - Ich werde die Antwort mit der neueren Version aktualisieren, wie du es dir vorschreibst Kenntnis der Tabellenstruktur und einer klaren Stichprobe aus OP –

Verwandte Themen