sql >> Base de Datos >  >> RDS >> Mysql

Comprobación de conflictos de rango de fechas en MySQL

El problema que tiene es que su consulta no es lo suficientemente robusta. Cuando analizas el problema, lo que tienes es esto:

Si el rango definido por $check_in y $check_out se superpone al rango definido por checkin y checkout en cualquier camino, entonces la habitación está reservada. De lo contrario, es gratis.

Esto significa que:

  • Si $check_in>=checkin y $check_in <=checkout , la habitación está RESERVADA
  • O Si $check_out>=checkin y $check_out <=checkout , la habitación está RESERVADA
  • O Si $check_in <=checkin y $check_out>=checkout , la habitación está RESERVADA

Por lo tanto, debe representar ambos escenarios en su subconsulta para obtener la información que está buscando.

Además, es de esperar que utilice datetime para sus comparaciones y no solo time , de lo contrario tendrá efectos secundarios.

EDITAR:Consulta SQL

(Tenga en cuenta que hay más de una forma de despellejar a un gato, por así decirlo. Solo estoy proporcionando un ejemplo que se apega a lo que ya tiene tanto como sea posible. Una vez más, también asumo que checkin , checkout , $check_in y $check_out todo se resolverá en datetime tipos)

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