Det här är svårt att komma med ett fullständigt svar för dig här, eftersom du bara visar oss tabellen som innehåller bokningarna - vi kan inte veta vilket utbud av rum som är tillgängliga.
SQL som returnerar room_id:s för rum som är bokade för åtminstone en del av den valda perioden kan vara:
SELECT `room_id` , COUNT(*)
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
GROUP BY `room_id`;
Om du hade en tabell med rum (snarare än bokningar), skulle det vara möjligt för dig att returnera en lista över alla rum som inte bokats under den perioden med:
SELECT `id`
FROM `rooms`
WHERE `id` NOT IN (
SELECT DISTINCT( `room_id` )
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
);
ÄNDRING
Baserat på feedback från OP är antagandena nu:
- Tabellen innehåller information om rum som är tillgängliga för en period som börjar på datumet i kolumn
dt
och slutar följande dag (dvs. hotellrum) - Frågan bör returnera alla rum som är tillgängliga för hela den angivna perioden (så endast rum som är tillgängliga från DAG A till DAG B kommer att returneras.
Som sådan är den ändrade koden:
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]"));