Подсчитать общее потраченное время, исключить паузы

0

У меня есть таблица журналов. Он содержит записи с задачами, статусом и временем срабатывания:

Таблица tblwork:

+-------------+------------+---------------------+-----+
| task        | status     | stime               | id  |
+-------------+------------+---------------------+-----+
| A           | 1          | 2018-03-07 20:00:00 | 1   |
| A           | 2          | 2018-03-07 20:30:00 | 2   |
| A           | 1          | 2018-03-07 21:00:00 | 3   |
| A           | 3          | 2018-03-07 21:30:00 | 4   |
+-------------+------------+---------------------+-----+

Состояние 1 означает начало, 2 - паузу, 3 - конец.

Пока что я пробую что-то вроде этого:

SELECT x1.stime, SUM(TIMEDIFF(x2.stime, x1.stime))
FROM tblwork AS x1 
LEFT JOIN tblwork AS x2
ON x1.id = x2.id + 1
WHERE x1.'status' = 1 OR x1.'status' = 3

Но это дало результат -6.000?!?!

Мне нужно рассчитать общее время, затраченное на выполнение задачи, но исключить паузу. Таким образом, окончательный результат должен быть 01:00:00. Можно ли это сделать таким образом или изменить таблицу и логику?

ОБНОВЛЕНИЕ: РЕШЕНИЕ

Я думаю, что нашел правильный способ сделать то, что хочу:

 SELECT id, stime,
  SUM(TIMESTAMPDIFF(SECOND,
    (SELECT MAX(stime) FROM tblwork WHERE stime < t.stime),
    stime
  )) AS TotalTime
FROM tblwork as t
where (t.status = 1 or t.status = 3)
  • 0
    должно быть 01:00:00 .. разница
  • 0
    почему задача А имеет два запуска (статус = 1)?
Показать ещё 1 комментарий
Теги:
datediff

1 ответ

0

Если вы посмотрите на свои данные, вы должны присоединиться только к x1.status = 1 и присоединиться к x2.status = 2 или 3

  SELECT x1.stime, SUM(TIMEDIFF(x2.stime, x1.stime))
  FROM tblwork AS x1 
  LEFT JOIN tblwork AS x2 ON x1.id = x2.id + 1 
        AND (x2.status = '2' OR x2.status = '3')
  WHERE x1.'status' = 1 
  • 0
    сейчас результат -3.000

Ещё вопросы

Сообщество Overcoder
Наверх
Меню