O problema que você está tendo é que sua consulta não é suficientemente robusta. Quando você decompõe o problema, o que você tem é o seguinte:
Se o intervalo definido por
$check_in
e $check_out
sobrepõe o intervalo definido por checkin
e checkout
em qualquer maneira, então o quarto está reservado. Caso contrário, é gratuito. Isso significa que:
- Se
$check_in
>=checkin
e$check_in
<=checkout
, o quarto está reservado - OU Se
$check_out
>=checkin
e$check_out
<=checkout
, o quarto está reservado - OU Se
$check_in
<=checkin
e$check_out
>=checkout
, o quarto está reservado
Portanto, você precisa representar esses dois cenários em sua subconsulta para obter as informações que está procurando.
Além disso, esperamos que você esteja usando
datetime
para suas comparações e não apenas time
, caso contrário, você terá efeitos colaterais. EDITAR:consulta SQL
(Lembre-se de que há mais de uma maneira de esfolar um gato, por assim dizer. Estou apenas fornecendo um exemplo que mantém o que você já tem o máximo possível. Mais uma vez, também estou assumindo que
checkin
, checkout
, $check_in
e $check_out
todos serão resolvidos para 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'))