Steffen: Zeitspannen + DB

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.

  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.

Danke schonmal im Voraus!

Grüße

  • Steffen
  1. 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

    --
    Möge der wahre Forumsgeist ewig leben!
  2. Hallo Steffen,

    1. 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

    1. 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

      • Steffen