Если предположить, что timeSchedule.startTime и timeSchedule.endTime оба являются типами данных Time, то это будет что-то вроде этого ...: (если нет, вы могли бы привести его как таковой).
DECLARE @pDoctorID Int = 56
DECLARE @pDate Date = '3/23/2012'
SELECT * FROM timeSchedule WHERE
NOT Exists (
SELECT doctorid FROM Appointments
WHERE doctorid = @pDoctorID AND
CAST(fromDatetime as Date) = @pDate AND
(
(CAST(fromDatetime as Time) >= timeSchedule.startTime AND
CAST(fromDatetime as Time) <= timeSchedule.endTime)
OR
(CAST(toDatetime as Time) >= timeSchedule.startTime AND
CAST(toDatetime as Time) <= timeSchedule.endTime)
OR
(CAST(toDatetime as Time) <= timeSchedule.startTime AND
CAST(fromDatetime as Time) >= timeSchedule.endTime)
)
)
Что сваш пример данных возвращает это:
1 |08: 00: 00.00 |09: 00: 00.00
4 |11: 00: 00.00 |12: 00: 00.00
8 |15: 00: 00.00 |16: 00: 00.00
По сути, запрос гласит: назначьте мне какое-либо назначение для этого врача, если существующие назначения не начинаются или не заканчиваются между временными рамками, или начинаются до и заканчиваются после любого из временных интервалов, определенныхтаблица timeSchedule.
Форматирование времени возврата также очень просто .См. Таблицу в этой ссылке для всех ваших вариантов.