Mysql
 sql >> Base de données >  >> RDS >> Mysql

Vérification des conflits de plage de dates dans MySQL

Le problème que vous rencontrez est que votre requête n'est pas suffisamment robuste. Lorsque vous décomposez le problème, vous obtenez ceci :

Si la plage définie par $check_in et $check_out chevauche la plage définie par checkin et checkout dans tout chemin, alors la chambre est réservée. Sinon, c'est gratuit.

Cela signifie que :

  • Si $check_in>=checkin et $check_in <=checkout , la salle est RÉSERVÉE
  • OU Si $check_out>=checkin et $check_out <=checkout , la salle est RÉSERVÉE
  • OU Si $check_in <=checkin et $check_out>=checkout , la salle est RÉSERVÉE

Vous devez donc représenter ces deux scénarios dans votre sous-requête afin d'obtenir les informations que vous recherchez.

De plus, vous utiliserez, espérons-le, datetime pour vos comparaisons et pas seulement time , sinon vous aurez des effets secondaires.

EDIT :Requête SQL

(Gardez à l'esprit qu'il existe plus d'une façon d'écorcher un chat, pour ainsi dire. Je ne fais que donner un exemple qui correspond autant que possible à ce que vous avez déjà. Encore une fois, je suppose également que checkin , checkout , $check_in , et $check_out résoudra tous en datetime types)

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'))