ИМХО, у
@alexclear переусложнено. Можно проще:
SELECT a.* FROM Apartment a
LEFT JOIN Apartment_Dates ad
ON ad.apartment_id=a.id AND ? BETWEEN ad.arrival_time AND ad.departure_time
WHERE ad.id IS NULL
Что касается решения
@Serhioromano, то в MySQL есть такая неприятная особенность: конструкция IN (SELECT ...) вычисляется для
каждой строки выбираемой таблицы. Т.е. если в таблице Apartment 1000 записей, то (SELECT FROM Apartment_Dates) при выполнении запроса будет вычислено 1000 раз. Понятно, что работает это намного медленнее, чем JOIN и exists().