Тук е трудно да се намери пълен отговор за вас, тъй като вие ни показвате само таблицата, която съдържа резервациите - не можем да знаем какъв набор от стаи са налични.
SQL, който връща room_id за стаи, които са резервирани поне за част от избрания период, може да бъде:
SELECT `room_id` , COUNT(*)
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
GROUP BY `room_id`;
Ако сте имали таблица със стаи (вместо резервации), би било възможно да върнете списък на всички стаи, които не са резервирани през този период с:
SELECT `id`
FROM `rooms`
WHERE `id` NOT IN (
SELECT DISTINCT( `room_id` )
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
);
ИЗМЕНЕНИЕ
Въз основа на обратната връзка от OP, предположенията сега са:
- Таблицата съдържа подробности за стаите, които са налични за период, започващ от датата в колона
dt
и приключва на следващия ден (т.е. хотелски стаи) - Заявката трябва да върне всички стаи, които са налични за целия въведен период (така че ще бъдат върнати само стаи, които са налични от ДЕН А до ДЕН Б.
Като такъв, измененият код е:
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]"));