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