думаю что тут может помочь квантование времени, т.е. разделение на минимальные отрезки, например прием должен быть кратен 10 минутам минимум. Дальше выбираем запросом время когда врач работает и все записи на этот день к этому врачу, по кускам занятого времени уже создаем табличку свободных промежутков,( например делаем красным ячейки с временем занятости и зеленым остальные). Дальше по нужному функционалу.
Есть в SQL запросы с условием between.
select starttime, endtime, pacient from Pacients where `starttime` between '2016/02/25 03:00:00.000' and '2016/02/25 15:00:00.000'
получишь массив с занятыми промежутками.