Prüfen auf Datumsbereichskonflikte in MySQL

7

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

    
Samia Ruponti 18.01.2012, 17:23
quelle

4 Antworten

23

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:

  • Wenn $check_in & gt; = checkin und $check_in & lt; = checkout , ist das Zimmer BOOKED
  • ODER Wenn $check_out & gt; = checkin und $check_out & lt; = checkout , ist das Zimmer BOOKED
  • ODER Wenn $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

%Vor%     
Brian Driscoll 18.01.2012, 17:30
quelle
10

Ihre ursprüngliche Logik war sehr nahe, Sie müssen nur die Werte '$check_in' und '$check_out' vertauschen. I.e .:

%Vor%

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.

    
Pryo 11.02.2013 12:09
quelle
1

Ich denke, das könnte Sie in die richtige Richtung bringen ...

%Vor%     
Web User 18.01.2012 17:31
quelle
0

Es gibt einige gute Ideen hier: Ссылка

Welche Spaltentypen verwenden Sie auch für Ihren Check-in und Check-out? Sind Sie sicher, dass Sie korrekt formatierte Werte in $ check_in und $ check_out übergeben?

    
Aerik 18.01.2012 17:30
quelle

Tags und Links