У меня есть таблица, как в следующем примере: 
Что мне нужно сделать, это вернуть покрытие (количество часов, в течение которых оператор / операторы были на месте) для каждого дня,Проблема заключается в том, что мне нужно игнорировать пробелы в покрытии, а не часы с двойным счетом, когда два оператора были зарегистрированы одновременно.Например, изображение ниже представляет собой визуальное представление таблицы.
Логика изображения следующая:
- Оператор A: вход в 10 и выход из полудня в общей сложности 2часы
- Оператор B: вход в 1 и выход из 3 в общей сложности 2 часа
- Оператор A: возврат и вход в 2 и выход из 5 в общей сложности3 часа, но 1 час перекрывается с оператором A, поэтому я не могу посчитать этот 1 час, иначе я буду иметь двойной счет подсчета
Поэтому общее время покрытия без перекрытий составляет 6 часов, и значение, которое мне нужно для запросапроизводить.До сих пор я мог игнорировать двойной счет, беря максимальные минимальные даты каждого дня и вычитая их два:
SELECT YEAR, WEEK, SUM(HOURS)
FROM
(SELECT
YEAR(SignedIn) AS YEAR,
WEEK(SignedIn) AS WEEK,
DAY(SignedIn) AS DAY,
time_to_sec(timediff(MAX(SignedOut), MIN(SignedIn)))/ 3600 AS HOURS
FROM OperatorLogs
GROUP BY YEAR, WEEK, DAY) As VirtualTable
GROUP BY YEAR, WEEK
, который выдает 7, потому что он принимает первый вход (10 AM) и вычисляет часыдо последнего выхода (16:00).Тем не менее, он включает в себя разрыв в охвате (12 - 1), который не должен быть включен.Я не уверен, как убрать это время из общего количества часов, а также не учитывать дважды, когда есть наложение, то есть из 2-3 должно быть только 1 час покрытия, даже если на месте работают два отдельных оператора, каждый из которых вводит один час.Любая помощь приветствуется.