2017-03-16 5 views
-2

Ich mache eine Website für Hotel Reservation System. Ich brauche Hilfe bei der Abfrage, ich habe den Post durchsucht, aber ich habe keine Lösung gefunden, die für mich funktioniert. In meiner DB habe ich Tischbuchung, mit Check-In und Check-Out-Datum, die von der Abfrage überprüft werden müssen, wenn die Benutzereingabe eincheckt und für das angegebene Zimmer auscheckt. Hier ist meine Frage:Abfrage für Hotel Reservation System php

SELECT * FROM booking WHERE room='$room' and ((checkin>='$cIN' and checkout<='$cOUT')or(checkin<='$cIN' and checkout>='$cOUT'))

'$ CIN' und '$ Cout' werden die Eingaben von Benutzern für Check-in und Check-out. Meine Anfrage funktioniert in einigen Fällen, sagen wir zum Beispiel, dass das Zimmer vom 15/03/2017 bis 20/03/2017 gebucht wird, wenn die neue Benutzereingabe 13/03/2017 bis 17/03/2017 dann die Anfrage nicht zurückgibt irgendwelche Ergebnisse, und der Benutzer kann den gleichen Raum buchen. Also in diesem Fall haben wir 2 Benutzer in einem Raum im gleichen Zeitintervall. Ich muss diese Art von Reservierungen einschränken. Danke im Voraus.

+1

Du bist gerade dafür, ob eine Periode vollständig die andere überlappt oder umgekehrt - aber natürlich müssen Sie auch die Fälle berücksichtigen, in denen nur eines der vom Benutzer eingegebenen Daten in den bereits gebuchten Zeitraum fällt. Wenn Sie Probleme haben, die richtige Logik herauszufinden, dann würde ich vorschlagen, dass Sie die möglichen Fälle auf ein Stück Papier kritzeln - das sollte helfen, es herauszufinden. – CBroe

+0

Wenn es keine zwei Buchungen am gleichen Datum geben kann (der erste Gast hat bis heute gebucht, der nächste Gast also erst ab morgen), dann müssen Sie nur überprüfen, ob das Start- oder Enddatum in einen bestehenden Zeitraum fällt (einschließlich Gleichheit am ersten/letzten Tag) – CBroe

+0

Vielen Dank für Ihre Antwort, ich denke, ich fand Lösung, hat Ihr Kommentar mir geholfen :) – marjov

Antwort

0

Um eine Überschneidung zu finden, müssen wir nach Artikeln suchen, bei denen ein Check-in vor einem vorhandenen Check-out UND das angeforderte Check-Out nach dem Check-in erfolgt.

-- Return existing bookings that overlap the requested date range 
SELECT * 
FROM booking 
WHERE room = '$room' 
and checkin <= '$cOUT' and checkout >= '$cIN' 

Simpler als du :) dachte

Beachten Sie, dass diese Abfrage keine neue Buchung zu checkin zur gleichen Zeit ermöglichen, die eine vorherige Buchung ausgecheckt. Wenn Ihr Check-in/out Felder keine Speicherzeit zu tun, dann müssen Sie diese Logik verändern < zu verwenden,> statt < =,> =