Hi zusammen,
SQL und Postgres ist nicht wirklich etwas neues für mich - aber dieses
Problemstellung treibt mich grad in den Wahnsinn.
Ich vermute ein Problem akuter Betriebsblindheit und frage jetzt hier mal nach:
Es gibt eine relaltiv "billige" Tabelle
Column | Type
----------+-----------------------
cid | integer
blockvon | date
blockbis | date
Check constraints:
"bldc" CHECK (blockvon <= blockbis)
Diese Tabelle beinhaltet für die jeweilige "id" gesperrte Datumsbereiche.
Ein Trigger verhindert zudem, dass sich Bereiche einer ID bereits überlappen.
Nun kommt das Problem:
Ich möchte eine Liste haben, die alle Sperrzeiten beinhaltet, die für bestimmte
IDs _gleichzeitig_ gelten.
Aber nur das jeweilige Start- und End-Datum dieser Bereiche.
Die diesem Inhalt
cid | blockvon | blockbis
--------+------------+------------
100204 | 2020-11-05 | 2020-12-27
100204 | 2021-02-04 | 2021-02-06
100204 | 2021-03-01 | 2021-03-31
100204 | 2021-01-04 | 2021-01-14
100205 | 2020-11-11 | 2020-12-31
100209 | 2020-12-20 | 2020-12-21
100209 | 2020-12-23 | 2020-12-25
(7 rows)
liefert mir dieses Query:
select (x.blockvon,x.blockbis) overlaps (y.blockvon,y.blockbis),x.cid,x.blockvon,y.blockbis,y.cid,y.blockvon,x.blockbis FROM pgf_park_blockdates as x,pgf_park_blockdates as y where (x.blockvon,x.blockbis) overlaps (y.blockvon,y.blockbis) and x.cid in(100204,100205,100209) and x.cid in(100204,100205,100209) and (x. blockvon <>y. blockvon) and (x.blockbis <>y.blockbis) order by x.blockvon, x.cid ;
LOG: duration: 0.945 ms statement: select (x.blockvon,x.blockbis) overlaps (y.blockvon,y.blockbis),x.cid,x.blockvon,y.blockbis,y.cid,y.blockvon,x.blockbis FROM pgf_park_blockdates as x,pgf_park_blockdates as y where (x.blockvon,x.blockbis) overlaps (y.blockvon,y.blockbis) and x.cid in(100204,100205,100209) and x.cid in(100204,100205,100209) and (x. blockvon <>y. blockvon) and (x.blockbis <>y.blockbis) order by x.blockvon, x.cid ;
Dieses Resultat
overlaps | cid | blockvon | blockbis | cid | blockvon | blockbis
----------+--------+------------+------------+--------+------------+------------
t | 100204 | 2020-11-05 | 2020-12-21 | 100209 | 2020-12-20 | 2020-12-27
t | 100204 | 2020-11-05 | 2020-12-31 | 100205 | 2020-11-11 | 2020-12-27
t | 100204 | 2020-11-05 | 2020-12-25 | 100209 | 2020-12-23 | 2020-12-27
t | 100205 | 2020-11-11 | 2020-12-27 | 100204 | 2020-11-05 | 2020-12-31
t | 100205 | 2020-11-11 | 2020-12-25 | 100209 | 2020-12-23 | 2020-12-31
t | 100205 | 2020-11-11 | 2020-12-21 | 100209 | 2020-12-20 | 2020-12-31
t | 100209 | 2020-12-20 | 2020-12-27 | 100204 | 2020-11-05 | 2020-12-21
t | 100209 | 2020-12-20 | 2020-12-31 | 100205 | 2020-11-11 | 2020-12-21
t | 100209 | 2020-12-23 | 2020-12-27 | 100204 | 2020-11-05 | 2020-12-25
t | 100209 | 2020-12-23 | 2020-12-31 | 100205 | 2020-11-11 | 2020-12-25
So weit, so gut - das kann ich jetzt als View ablegen und auswerten.
Aber wie bekomme ich es hin, dass ich nur den Zeitbereich
2020-12-20 bis 2020-12-21
und
2020-12-23 bis 2020-12-25
zurück geliefert bekomme?
Ist das in einem einzelnen Statement möglich? (ohne PL/PgSQL)
oder gar in Standard-SQL?
Bislang ist mir noch nichts dazu eingefallen.
Ich vermute, ich sehe den Wald vor lauter Bäumen nicht.....
SQL und Postgres ist nicht wirklich etwas neues für mich - aber dieses
Problemstellung treibt mich grad in den Wahnsinn.
Ich vermute ein Problem akuter Betriebsblindheit und frage jetzt hier mal nach:
Es gibt eine relaltiv "billige" Tabelle
Column | Type
----------+-----------------------
cid | integer
blockvon | date
blockbis | date
Check constraints:
"bldc" CHECK (blockvon <= blockbis)
Diese Tabelle beinhaltet für die jeweilige "id" gesperrte Datumsbereiche.
Ein Trigger verhindert zudem, dass sich Bereiche einer ID bereits überlappen.
Nun kommt das Problem:
Ich möchte eine Liste haben, die alle Sperrzeiten beinhaltet, die für bestimmte
IDs _gleichzeitig_ gelten.
Aber nur das jeweilige Start- und End-Datum dieser Bereiche.
Die diesem Inhalt
cid | blockvon | blockbis
--------+------------+------------
100204 | 2020-11-05 | 2020-12-27
100204 | 2021-02-04 | 2021-02-06
100204 | 2021-03-01 | 2021-03-31
100204 | 2021-01-04 | 2021-01-14
100205 | 2020-11-11 | 2020-12-31
100209 | 2020-12-20 | 2020-12-21
100209 | 2020-12-23 | 2020-12-25
(7 rows)
liefert mir dieses Query:
select (x.blockvon,x.blockbis) overlaps (y.blockvon,y.blockbis),x.cid,x.blockvon,y.blockbis,y.cid,y.blockvon,x.blockbis FROM pgf_park_blockdates as x,pgf_park_blockdates as y where (x.blockvon,x.blockbis) overlaps (y.blockvon,y.blockbis) and x.cid in(100204,100205,100209) and x.cid in(100204,100205,100209) and (x. blockvon <>y. blockvon) and (x.blockbis <>y.blockbis) order by x.blockvon, x.cid ;
LOG: duration: 0.945 ms statement: select (x.blockvon,x.blockbis) overlaps (y.blockvon,y.blockbis),x.cid,x.blockvon,y.blockbis,y.cid,y.blockvon,x.blockbis FROM pgf_park_blockdates as x,pgf_park_blockdates as y where (x.blockvon,x.blockbis) overlaps (y.blockvon,y.blockbis) and x.cid in(100204,100205,100209) and x.cid in(100204,100205,100209) and (x. blockvon <>y. blockvon) and (x.blockbis <>y.blockbis) order by x.blockvon, x.cid ;
Dieses Resultat
overlaps | cid | blockvon | blockbis | cid | blockvon | blockbis
----------+--------+------------+------------+--------+------------+------------
t | 100204 | 2020-11-05 | 2020-12-21 | 100209 | 2020-12-20 | 2020-12-27
t | 100204 | 2020-11-05 | 2020-12-31 | 100205 | 2020-11-11 | 2020-12-27
t | 100204 | 2020-11-05 | 2020-12-25 | 100209 | 2020-12-23 | 2020-12-27
t | 100205 | 2020-11-11 | 2020-12-27 | 100204 | 2020-11-05 | 2020-12-31
t | 100205 | 2020-11-11 | 2020-12-25 | 100209 | 2020-12-23 | 2020-12-31
t | 100205 | 2020-11-11 | 2020-12-21 | 100209 | 2020-12-20 | 2020-12-31
t | 100209 | 2020-12-20 | 2020-12-27 | 100204 | 2020-11-05 | 2020-12-21
t | 100209 | 2020-12-20 | 2020-12-31 | 100205 | 2020-11-11 | 2020-12-21
t | 100209 | 2020-12-23 | 2020-12-27 | 100204 | 2020-11-05 | 2020-12-25
t | 100209 | 2020-12-23 | 2020-12-31 | 100205 | 2020-11-11 | 2020-12-25
So weit, so gut - das kann ich jetzt als View ablegen und auswerten.
Aber wie bekomme ich es hin, dass ich nur den Zeitbereich
2020-12-20 bis 2020-12-21
und
2020-12-23 bis 2020-12-25
zurück geliefert bekomme?
Ist das in einem einzelnen Statement möglich? (ohne PL/PgSQL)
oder gar in Standard-SQL?
Bislang ist mir noch nichts dazu eingefallen.
Ich vermute, ich sehe den Wald vor lauter Bäumen nicht.....