MySQL / MariaDB: суммировать несколько разрозненных обращений рабочего времени, чтобы определить, когда офис открыт? - PullRequest
1 голос
/ 07 июня 2019

Я работаю с системой управления пациентами, которая имеет гибкие возможности планирования для поставщиков. Я хотел бы сделать вывод о количестве часов, в течение которых клиника (или офис) открыта, учитывая, что поставщики могут начинать и останавливать свои смены в любое время и что поставщик может иметь несколько смен в течение одного дня. Я использую MariaDB 10.3

Это изображение показывает расписание двух провайдеров, доктора К и доктора П.

Picture of provider schedule

  • 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)
;
...