Я работаю с системой управления пациентами, которая имеет гибкие возможности планирования для поставщиков. Я хотел бы сделать вывод о количестве часов, в течение которых клиника (или офис) открыта, учитывая, что поставщики могут начинать и останавливать свои смены в любое время и что поставщик может иметь несколько смен в течение одного дня. Я использую MariaDB 10.3
Это изображение показывает расписание двух провайдеров, доктора К и доктора П.
Dr. K и доктор P начинают свой день в 6:00 утра. Они работают в течение двух часов, а затем останавливаются на двухчасовой перерыв в 8:00 утра. Клиника была открыта в течение 2 часов.
Dr. K и доктор P затем снова начинают работать в 10:00. Они снова останавливаются в 12:00 на обед. Клиника была открыта в течение 2 часов.
Dr. Р начинает свою смену в 14:00 и заканчивает в 18:00. Доктор К. начинает свою смену позже в 16:00 и заканчивает в 18:30. Клиника была открыта в течение 4,5 часов
Общее количество часов, в течение которых эта клиника запланирована как открытая, составляет 8,5 (2 часа + 2 часа + 4,5)
В базе данных нет индикации или флага о каком-либо перерыве или закрытом времени. Он должен быть выведен из столбцов StartTime и StopTime.
Сначала я решил использовать рекурсивный CTE для построения списка пустых временных интервалов, а затем вычесть сумму этих временных интервалов из минимального времени начала и максимального времени остановки для дня, аналогичного этой проблеме . Но клиника закрывается только тогда, когда все провайдеры не работают, что бросает рывок в работе.
Соответствующий стол и скрипка:
https://www.db -fiddle.com / ж / pfNN1NJMAZB76EaPhinzsF / 0
CREATE TABLE `scheduletest` (
`ScheduleNum` BIGINT(20) NOT NULL DEFAULT 0,
`SchedDate` DATE NULL,
`StartTime` TIME NULL,
`StopTime` TIME NULL,
`ProvNum` BIGINT(20) NOT NULL
)
ENGINE=InnoDB
;
CREATE TABLE `providertest` (
`ProvNum` BIGINT(20) NOT NULL DEFAULT 0,
`Abbr` VARCHAR(255) NULL DEFAULT NULL
)
ENGINE=InnoDB
;
INSERT INTO `providertest` (`ProvNum`,`Abbr`) VALUES
(1,'DR K')
,(2,'DR P')
;
INSERT INTO `scheduletest` (`ScheduleNum`,`SchedDate`,`StartTime`,`StopTime`,`ProvNum`) VALUES
(79786,'2019-06-06','06:00:00','08:00:00',1)
,(79787,'2019-06-06','10:00:00','12:00:00',1)
,(79788,'2019-06-06','06:00:00','08:00:00',2)
,(79789,'2019-06-06','10:00:00','12:00:00',2)
,(79790,'2019-06-06','14:00:00','18:00:00',2)
,(79791,'2019-06-06','16:00:00','18:30:00',1)
;