Zeitspannen + DB
Steffen
- datenbank
- postgresql
0 robertroth0 Christian Kruse0 Steffen
Hallo,
ich möchte in einer Datenbank (Postgres) Verträge verwalten. Die Verträge haben eine Laufzeit, bzw. ein Start- und ein Enddatum.
Nun möchte ich gern bei Verträgen, die sich auch ein Objekt beziehen, sicherstellen, dass es bei den Laufzeiten kein Überschneidungen gibt.
Ich sehe hier 3 relevante Spalten.
Danke schonmal im Voraus!
Grüße
Liebe Mitdenker, liebe Wissende, liebe Neugierige,
ich möchte in einer Datenbank (Postgres) Verträge verwalten. Die Verträge haben eine Laufzeit, bzw. ein Start- und ein Enddatum.
Nun möchte ich gern bei Verträgen, die sich auch ein Objekt beziehen, sicherstellen, dass es bei den Laufzeiten kein Überschneidungen gibt.
(1) Kann ich das irgendwie in der DB mit Contraints absichern? (2) Wie kann ich möglichst effizient prüfen, dass es kein Überschneidungen gibt?
Ich sehe hier 3 relevante Spalten.
- startdatum
- enddatum
- objektid -> auf dieses Objekt bezieht sich er Vertrag, bei gleicher "objektid" darf es keine Überschneidungen geben.
Da guckst Du mal im Archiv. Das ist zwar für mysql, aber Du kannst es sicher anpassen
Spirituelle Grüße
Euer Robert
robert.r@online.de
Hallo Steffen,
- Kann ich das irgendwie in der DB mit Contraints absichern?
Ja. Mit einem (relativ einfachen) BEFORE INSERT
- bzw BEFORE UPDATE
-Trigger.
(2) Wie kann ich möglichst effizient prüfen, dass es kein Überschneidungen gibt?
SELECT EXISTS(SELECT id FROM entries b WHERE a.start_date BETWEEN b.start_date AND b.end_date OR a.end_date BETWEEN b.start_date AND b.end_date);
Das EXITS()
mit dem Subquery bricht bei der ersten gefundenen Stelle ab, es wird gar nicht erst ein grosses Result-Set gebildet und gibt ein BOOLEAN
zurück.
LG,
CK
Danke für diesen Vorschlag. Das gefällt mir.
Nur der Vollständigkeit halber, man müsste noch den Fall hinzufügen, wenn B von A komplett eigeschlossen ist.
Danke