Trudno tutaj znaleźć dla Ciebie kompletną odpowiedź, ponieważ pokazujesz nam tylko tabelę zawierającą rezerwacje - nie wiemy, jaki zakres pokoi jest dostępny.
SQL, który zwraca room_id dla pokoi, które są zarezerwowane przynajmniej przez część wybranego okresu, może wyglądać tak:
SELECT `room_id` , COUNT(*)
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
GROUP BY `room_id`;
Gdybyś miał tabelę pokoi (zamiast rezerwacji), możliwe byłoby zwrócenie listy wszystkich pokoi nie zarezerwowanych w tym okresie za pomocą:
SELECT `id`
FROM `rooms`
WHERE `id` NOT IN (
SELECT DISTINCT( `room_id` )
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
);
ZMIANA
Na podstawie opinii OP, założenia są teraz następujące:
- Tabela zawiera szczegółowe informacje o pokojach, które są dostępne w okresie rozpoczynającym się w dniu w kolumnie
dt
i kończące się następnego dnia (tj. pokoje hotelowe) - Zapytanie powinno zwrócić wszystkie pokoje, które są dostępne przez cały wprowadzony okres (więc zwrócone zostaną tylko pokoje, które są dostępne od DNIA A do DNIA B).
W związku z tym zmieniony kod to:
SELECT room_id
FROM available_rooms
WHERE dt BETWEEN "[start date]" AND DATE_SUB("[end date]",INTERVAL 1 DAY)
GROUP BY room_id
HAVING COUNT(*)=ABS(DATEDIFF("[start date]","[end date]"));