Я пытаюсь создать запрос для отображения списка открытых временных интервалов на определенный день.Здесь я нашел много похожих вопросов, но ни один из ответов, похоже, не справился с этой задачей.
Упрощенная версия моей таблицы забронированных встреч:
Имя таблицы: app_bookings (до вывода)
CREATE TABLE `app_bookings` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`client_id` INT(11) NOT NULL DEFAULT '0',
`provider_id` INT(11) NOT NULL DEFAULT '0',
`doctor_id` INT(11) NOT NULL DEFAULT '0',
`department_id` INT(11) NOT NULL DEFAULT '0',
`date` DATE NOT NULL,
`StartTime` DATETIME NULL DEFAULT NULL,
`EndTime` DATETIME NULL DEFAULT NULL,
`duration` INT(11) NOT NULL,
`payment` VARCHAR(50) NOT NULL,
`created_by` INT(11) NOT NULL,
`updated_by` INT(11) NOT NULL,
`created_at` DATETIME NOT NULL,
`updated_at` DATETIME NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `app_bookings` ( `client_id`, `provider_id`, `doctor_id`, `department_id`, `date`, `StartTime`, `EndTime`, `duration`, `payment`, `created_by`, `updated_by` ) VALUES
( 1, 3, 11, 1, '2018-10-21', '2018-10-21 10:15:00', '2018-10-21 11:00:00', 0, '', 0, 0 ),
( 1, 3, 11, 1, '2018-10-21', '2018-10-21 11:15:00', '2018-10-21 13:00:00', 0, '', 0, 0 ),
( 1, 3, 11, 1, '2018-10-21', '2018-10-21 14:15:00', '2018-10-21 14:45:00', 0, '', 0, 0 ),
( 1, 3, 11, 1, '2018-10-21', '2018-10-21 15:00:00', '2018-10-21 15:45:00', 0, '', 0, 0 ),
( 1, 3, 11, 1, '2018-10-21', '2018-10-21 16:00:00', '2018-10-21 16:30:00', 0, '', 0, 0 );
Мой текущий запрос MYSQL : (я извлек это из другого ответа и изменил для моего использования)
SELECT AvailStartTime, AvailEndTime
FROM (SELECT @lastEndTime as AvailStartTime, StartTime as AvailEndTime,
@lastEndTime := EndTime
FROM (SELECT StartTime, EndTime
FROM app_bookings
WHERE doctor_id = 14
AND EndTime >= '2018-10-21 10:00'
AND StartTime < '2018-10-21 19:00'
ORDER BY StartTime
) e
JOIN (SELECT @lastEndTime := NULL) init) x WHERE
AvailEndTime > DATE_ADD(AvailStartTime, INTERVAL 15 MINUTE)
В результате вышеприведенного запроса выводится следующее:
Я получаю правильный вывод, используя этот запрос, но мне нужно пропуститьобеденный перерыв для врача, начало обеда будет @startlunch с «13:00» до «14:00» и получит запись с 2018-10-21 15:30:00 до 2018-10-21 19:00 (пропустите, если забронирован какой-либо вход)