Ich schreibe ein Hotelbuchungssystem. nach viel lernen (einschließlich stack overflow) schrieb ich diese sql um freie zimmer zu finden:
%Vor%aber das Problem ist, es ist nicht die Zeit Überprüfung ist 12:00:00 und Kasse ist 11:59:00
es gibt auch nicht die richtigen Abfragen wie innerhalb des Datumsbereichs funktioniert es nicht, wenn ich von 15-18 ein Einzelzimmer buchen, dessen Nummer 501 ist. Wenn ich noch einmal eine Abfrage 17-19 ausführen scheint diese Zimmer frei, aber in Wirklichkeit es sollte besetzt sein.
kann jemand einen sehr guten und effektiven sql vorschlagen, der das genaue Datum erhält, so dass kein Zusammenstoß Buchungssystem passieren wird, weil das System in Wirklichkeit implementiert wird, so werden Fehler viele Probleme verursachen.
Danke im Voraus
Das Problem, das Sie haben, ist, dass Ihre Abfrage nicht ausreichend robust ist. Wenn Sie das Problem aufschlüsseln, haben Sie Folgendes:
Wenn der durch $check_in
und $check_out
definierte Bereich den durch checkin
und checkout
in beliebig definierten Bereich überlappt, wird der Raum gebucht. Ansonsten ist es kostenlos.
Das bedeutet:
$check_in
& gt; = checkin
und $check_in
& lt; = checkout
, ist das Zimmer BOOKED
$check_out
& gt; = checkin
und $check_out
& lt; = checkout
, ist das Zimmer BOOKED
$check_in
& lt; = checkin
und $check_out
& gt; = checkout
, ist das Zimmer BOOKED
Sie müssen also beide Szenarien in Ihrer Unterabfrage darstellen, um die gesuchten Informationen zu erhalten.
Außerdem werden Sie hoffentlich datetime
für Ihre Vergleiche verwenden und nicht nur time
, sonst haben Sie Nebenwirkungen.
BEARBEITEN: SQL-Abfrage
(Denken Sie daran, dass es mehr als eine Möglichkeit gibt, eine Katze zu häuten. Ich gebe nur ein Beispiel, das mit dem, was Sie bereits haben, so viel wie möglich beibehält. Ich nehme wieder einmal an Die checkin
, checkout
, $check_in
und $check_out
werden alle zu datetime
types) aufgelöst
Ihre ursprüngliche Logik war sehr nahe, Sie müssen nur die Werte '$check_in'
und '$check_out'
vertauschen. I.e .:
Brian Driscolls Antwort konzentriert sich auf die Szenarien, die Buchungskonflikte ausmachen:
%Vor%Allerdings sind die Senarios, die den nein Konflikt ausmachen, viel einfacher. Es gibt nur zwei:
%Vor%So kann die Situation, in der es keinen Konflikt zwischen einer Buchung und einer möglichen Buchung gibt, mit diesem SQL ausgedrückt werden:
%Vor%Um stattdessen nach Konflikten zu suchen, müssen wir dies nur negieren. Mit dem DeMorgan-Gesetz lautet die Negation also:
%Vor%... was zu der oben angegebenen Lösung führt.