MySQL - рассчитать чистую разницу во времени между двумя датами и временем без учета перерывов? - PullRequest
5 голосов
/ 23 марта 2010

В запросе MySQL я использую функции timediff / time_to_sec для подсчета общего количества минут между двумя датами.

Например:

2010-03-23 10:00:00
-
2010-03-23 08:00:00
= 120 minutes

Что я хотел бы сделать, так это исключить любые перерывы, которые происходят в течение выбранного временного диапазона.

Например:

2010-03-23 10:00:00
-
2010-03-23 08:00:00
-
(break 08:55:00 to 09:10:00)
= 105 minutes

Есть ли хороший способ сделать это, не прибегая к длинному списку вложенных операторов IF?

Update1:

Чтобы уточнить - я пытаюсь подсчитать, сколько времени требуется пользователю для выполнения данной задачи. Если они берут перерыв на кофе, этот период должен быть исключен. Перерывы на кофе проводятся в определенное время.

1 Ответ

10 голосов
/ 23 марта 2010

Суммируйте все ваши разрывы, которые произошли за время, а затем вычтите результат работы функции timediff / time_to_sec

SELECT TIME_TO_SEC(TIMEDIFF('17:00:00', '09:00:00')) -- 28800

SELECT TIME_TO_SEC(TIMEDIFF('12:30:00', '12:00:00')) -- 1800
SELECT TIME_TO_SEC(TIMEDIFF('10:30:00', '10:15:00')) -- 900

-- 26100

Предполагая эту структуру:

CREATE TABLE work_unit (
 id INT NOT NULL,
 initial_time TIME,
 final_time TIME
)
CREATE TABLE break (
 id INT NOT NULL,
 initial_time TIME,
 final_time TIME
)
INSERT work_unit VALUES (1, '09:00:00', '17:00:00')
INSERT break VALUES (1, '10:00:00', '10:15:00')
INSERT break VALUES (2, '12:00:00', '12:30:00')

Вы можете рассчитать его следующим запросом:

SELECT *, TIME_TO_SEC(TIMEDIFF(final_time, initial_time)) total_time
, (SELECT SUM(
 TIME_TO_SEC(TIMEDIFF(b.final_time, b.initial_time)))
  FROM break b 
  WHERE (b.initial_time BETWEEN work_unit.initial_time AND work_unit.final_time) OR (b.final_time BETWEEN work_unit.initial_time AND work_unit.final_time)
 ) breaks 
FROM work_unit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...