Reservierungsprüfung

trixzer

Benutzer
Beiträge
14
Guten Abend, ich programmiere mir derzeit eine kleine Reservierungssoftware und stehe gerade heftigst auf dem Schlauch (vielleicht wegen der späten Uhrzeit? :confused:). Auf meinem RPi liegt eine SQL Datenbank. Hier sind meine Zimmerreservierungen angelegt. Sagen wir das System ist das gleiche wie beim Hotel:
X ist meine zu überprüfende Anreise
Y meine zu überprüfende Abreise.
Die An- und Abreisen sind in den Spalten Anreise, Abreise festgelegt.

Habe mir heute in der Schule gedanken darüber gemacht und festgestellt, dass das eigentlich ganz einfach ist. Aber irgendwie sitze ich jetzt schon Stunden vor und komme auf keine brauchbare Lösungen..

Bedingungen:
X darf nicht zwischen Anreise und Abreise einer Buchung sein.
X darf gleich Abreise einer Buchung sein:

| |
| | !!!
| | OK (Halt wie in nem Hotel)

Y darf nicht zwischen Anreise und Abreise einer Buchung sein.
Y darf gleich Anreise einer anderen Buchung sein.

Habe mir letzte Woche in der Schule gedanken darüber gemacht und festgestellt, dass das eigentlich ganz einfach ist. Aber irgendwie sitze ich jetzt schon Stunden vor und komme auf keine brauchbare Lösungen..:

Code:
SELECT * FROM Reservierungen
  WHERE (('X' BETWEEN Anreise AND Abreise)
  OR (Anreise BETWEEN 'X' AND 'Y')
  OR (Abreise BETWEEN 'X' AND 'Y'))
  AND Zimmer='%Zimmer%';

Das funktioniert so. Einziges Problem aufgrund der BETWEEN Befehle ist, dass die Überschneidungen falsch erkannt werden und ich komme einfach nicht auf eine Lösung.

Beispiel: Anreise: 03.03.03 Abreise: 03.05.03
Abfrage für: Anreise:03.05.03 Abreise: xx.xx.xx

Meine Software prüft ob das erhaltene Array der Abfrage gleich 0 ist. Es müsste nun eigentlich Null sein und eine Reservierung dürfte stattfinden. Ist es aber leider nicht, da die Between Befehle ja einschließlich der Grenzen prüfen. Ich glaube die Lösung ist leichter als ich mir das Vorstelle, vielleicht denke ich auch einfach zu kompliziert.. Eigentlich müsste ich das ganze mit Vergleichsoperatoren lösen können aber den Versuch habe ich auch schon hinter mir.... Ich hoffe mir kann jemand weiter helfen.

Vielen Dank im vorraus!!!
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
Ja ich glaube da beschreibst du genau mein Problem. Es geht halt einfach um eine Zimmerreservierung, wie im Hotel. Kennst das ja, man reist Freitag an und Sonntag ab und am Sonntag zieht dann vllt. der nächste ins Zimmer. Habe halt zwei Timestamps und will das Problem lösen...

funktioniert das auch mit Mysql?
 
Eigentlich ist das in jeder SQL DB mit Bordmitteln einfach zu lösen. Wenn der Anreise Tag = Abreise Tag sein darf rechnest du einfach Buchung_bis - 1 Tag und prüfst dann ob die Zeiträume sich überschneiden. Dazu einfach von einem der beiden Zeiträume prüfen ob erster oder letzter Tag innerhalb des anderen Zeitraums liegen. Also 2 Vergleiche mit BETWEEN.
 
Ja dann muss ich das irgendwie mit Vergleichen lösen. Es läuft jetzt alles so wie es laufen soll, will jetzt nicht noch da irgendwie nen Postgresql Server installieren. Aber danke schonmal für einen Lösungsvorschlag.
@ukulele ich verstehe nicht ganz wie du das meinst mit Buchung_bis - 1 Tag? Könntest du da vllt. ein praktisches Beispiel zeigen? Also habe ja oben drei Between abfragen aufgeführt, also so wie ich es jetzt habe. Da ist jetzt nur noch das Problem, dass ein Wert ausgegeben wird, wenn Anreise von einer neuen Buchung = Abreise einer alten Buchung ist. Aber das soll ja so nichts sein. Da darf kein Wert übergegebn werden..
 
Code:
SELECT    *
FROM    Reservierungen
WHERE (    @X BETWEEN Anreise AND Abreise - 1
OR        @Y BETWEEN Anreise AND Abreise )
AND        Zimmer = @Zimmer
Das würde die Überschneidungen des Zeitraums @X bis @Y mit bereits eingetragenen Reservierungen ausgeben.
 
Werbung:
ich wusste doch das ich zu kompliziert denke. Scheint so als hätte ich die Lösung nun.

Das mag funktionieren, sicher. Nur stellst Du die Constraints mit Hilfe der Applikation her, nicht auf DB-Ebene. Sprich: Du kannst nicht verhindern, daß z.B. mal 'aus Versehen' sowas mit z.B. PhpMyAdmin eingetragen wird, also eine Doppelbuchung. Das wäre der Charme eine Lösung mit PG und Constraints, die direkt durch die DB realisiert werden.

PS.: das wäre außerdem auch um einige Zehnerpotenzen schneller, was aber bei einigen wenigen hundert Datensätzen, von denen ich bei Dir ausgehe, egal sein mag.
 
Zurück
Oben