У меня есть таблица журналов. Он содержит записи с задачами, статусом и временем срабатывания:
Таблица 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)
Если вы посмотрите на свои данные, вы должны присоединиться только к 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