Problemet du har är att din fråga inte är tillräckligt robust. När du bryter ner problemet, vad du har är detta:
Om intervallet definieras av $check_in
och $check_out
överlappar intervallet som definieras av checkin
och checkout
i alla sätt, då är rummet bokat. Annars är det gratis.
Det betyder att:
- Om
$check_in
>=checkin
och$check_in
<=checkout
, rummet är BOKAT - ELLER Om
$check_out
>=checkin
och$check_out
<=checkout
, rummet är BOKAT - ELLER Om
$check_in
<=checkin
och$check_out
>=checkout
, rummet är BOKAT
Så du måste representera båda dessa scenarier i din underfråga för att få den information du letar efter.
Dessutom kommer du förhoppningsvis att använda datetime
för dina jämförelser och inte bara time
, annars kommer du att få biverkningar.
EDIT:SQL-fråga
(Tänk på att det finns mer än ett sätt att flå en katt så att säga. Jag ger bara ett exempel som stämmer överens med det du redan har så mycket som möjligt. Återigen antar jag också att checkin
, checkout
, $check_in
och $check_out
kommer alla att lösas till datetime
typer)
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'))