Вы можете сделать что-то вроде этого:
select rooms.* from rooms
left join reservations
on rooms.id = reservations.room_id
and reservations.date = '2019-05-28' and reservations.time_start < '14:00' and reservations.time_finish > '14:00'
where reservations.id is null
Если схема теста имеет вид:
SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
CREATE TABLE `reservations` (
`id` int(11) NOT NULL,
`room_id` int(11) NOT NULL,
`date` date NOT NULL,
`time_start` time NOT NULL,
`time_finish` time NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `reservations` (`id`, `room_id`, `date`, `time_start`, `time_finish`) VALUES
(0, 2, '2019-05-28', '13:00:00', '16:00:00');
CREATE TABLE `rooms` (
`id` int(11) NOT NULL,
`name` varchar(15) NOT NULL,
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `rooms` (`id`, `name`) VALUES
(1, 'room1'),
(2, 'room2');
Пример скрипки:
http://sqlfiddle.com/#!9/f82a5c/1