Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Suche nach Datumsbereichskonflikten in MySQL

Das Problem, das Sie haben, ist, dass Ihre Abfrage nicht robust genug ist. Wenn Sie das Problem aufschlüsseln, erhalten Sie Folgendes:

Wenn der durch $check_in definierte Bereich und $check_out den durch checkin definierten Bereich überlappt und checkout in beliebigen Übrigens, dann ist das Zimmer gebucht. Andernfalls ist es kostenlos.

Das bedeutet:

  • Wenn $check_in>=checkin und $check_in <=checkout , das Zimmer ist GEBUCHT
  • ODER Wenn $check_out>=checkin und $check_out <=checkout , das Zimmer ist GEBUCHT
  • ODER Wenn $check_in <=checkin und $check_out>=checkout , das Zimmer ist GEBUCHT

Sie müssen also beide Szenarien in Ihrer Unterabfrage darstellen, um die gesuchten Informationen zu erhalten.

Außerdem verwenden Sie hoffentlich datetime für Ihre Vergleiche und nicht nur time , sonst treten Nebenwirkungen auf.

BEARBEITEN:SQL-Abfrage

(Denken Sie daran, dass es sozusagen mehr als eine Möglichkeit gibt, eine Katze zu häuten. Ich liefere nur ein Beispiel, das so weit wie möglich mit dem übereinstimmt, was Sie bereits haben. Ich gehe auch hier davon aus, dass checkin , checkout , $check_in , und $check_out werden alle zu datetime aufgelöst Typen)

SELECT *
FROM room
WHERE room_id NOT IN
(SELECT room_id 
 FROM bookings
 WHERE
   (checkin <= '$check_in' AND checkout >= '$check_in') OR
   (checkin <= '$check_out' AND checkout >= '$check_out') OR
   (checkin >= '$check_in' AND checkout <= '$check_out'))