2015-01-30 9 views
1

Я пытаюсь суммировать все значения timedifference и показывать в формате HH: mm: ss, но результат меньше, чем должен быть.Сумма всех значений timediff показывает неправильное значение

Вот мое DDLS и моя попытка до сих пор:

CREATE TABLE tblproduction 
    (
    OperaterID int, 
    OperationID varchar(20), 
    StartDateTime datetime, 
    EndDateTime datetime 
    ); 

INSERT INTO `tblproduction` VALUES 
(227, 'OPEE21', '2014-12-01 05:51:34', '2014-12-01 06:48:30'), 
(227, 'OPEE21', '2014-12-01 06:54:37', '2014-12-01 10:14:30'), 
(227, 'OPEE21', '2014-12-01 10:23:03', '2014-12-01 13:41:31'), 
(227, 'OPEE21', '2014-12-02 05:54:09', '2014-12-02 07:50:53'), 
(227, 'OPEE21', '2014-12-02 07:55:03', '2014-12-02 13:37:56'), 
(227, 'OPEE21', '2014-12-09 14:06:57', '2014-12-09 17:20:09'), 
(227, 'OPEE21', '2014-12-09 17:22:07', '2014-12-09 21:51:24'), 
(227, 'OPEE21', '2014-12-11 14:06:12', '2014-12-11 18:36:47'), 
(227, 'OPEE21', '2014-12-12 14:07:09', '2014-12-12 14:58:42'), 
(227, 'OPEE21', '2014-12-12 15:05:23', '2014-12-12 15:49:37'), 
(227, 'OPEE21', '2014-12-12 15:55:12', '2014-12-12 21:55:24'), 
(227, 'OPEE21', '2014-12-15 05:54:42', '2014-12-15 12:32:58'), 
(227, 'OPEE21', '2014-12-15 12:38:48', '2014-12-15 13:40:08'), 
(227, 'OPEE21', '2014-12-18 10:47:07', '2014-12-18 13:36:55'), 
(227, 'OPEE21', '2014-12-19 06:16:58', '2014-12-19 13:37:29'), 
(227, 'OPEE21', '2014-12-22 14:09:29', '2014-12-22 21:53:45'), 
(227, 'OPEE21', '2014-12-23 14:26:54', '2014-12-23 17:12:13'), 
(227, 'OPEE21', '2014-12-23 17:14:11', '2014-12-23 18:00:40'), 
(227, 'OPEE21', '2014-12-23 18:03:51', '2014-12-23 21:07:57'), 
(227, 'OPEE21', '2014-12-23 21:08:56', '2014-12-23 21:46:58'); 

SELECT p.OperaterID 
    , p.OperationID 
    , p.StartDateTime 
    , p.EndDateTime 
    , TIME_FORMAT(SUM(TIMEDIFF(p.EndDateTime, p.StartDateTime)), '%H:%i:%s') TotalTime 
    FROM tblproduction p 
WHERE p.StartDateTime >= '2014-12-01 00:00:00' 
    AND p.StartDateTime <= '2014-12-31 23:59:59' 
    AND p.OperaterID = 227 
    AND p.OperationID = 'OPEE21' 
GROUP 
    BY p.OperationID; 

+------------+-------------+---------------------+---------------------+-----------+ 
| OperaterID | OperationID | StartDateTime  | EndDateTime   | TotalTime | 
+------------+-------------+---------------------+---------------------+-----------+ 
|  227 | OPEE21  | 2014-12-01 05:51:34 | 2014-12-01 06:48:30 | 63:48:44 | 
+------------+-------------+---------------------+---------------------+-----------+ 

... и скрипка того же SQL Fiddle

Результат должен быть 67:52:04, но запрос возвращает 63:48 : 44. Я не сейчас, где я потерял 4 часа.

+0

Вы выбираете 'p.OperaterID' [так в оригинале],' p.OperationID', 'p.StartDateTime' и' p.EndDateTime', но только GROUP BY 'OperationID'. Это не сработает. MySQL прощает упущение. Другие РСУБД будут выходить из строя. – Strawberry

ответ

2

Это применять SUM на результат TimeDiff. Вы должны сначала преобразовать TIMEDIFF в секунды, чем SUM, а затем преобразовать обратно.

SELECT OperaterID, OperationID, 
StartDateTime, EndDateTime, 
SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(tblproduction.EndDateTime, tblproduction.StartDateTime)))) AS TotalTime 
FROM tblproduction 
WHERE StartDateTime >= '2014-12-01 00:00:00' AND StartDateTime <= '2014-12-31 23:59:59' AND OperaterID = 227 AND OperationID = 'OPEE21' 
GROUP BY OperationID; 
+0

Это решение в целом правильное, но оно страдает от тех же проблем, которые наблюдаются выше. – Strawberry

1

Вот один из способов ...

SELECT operaterid 
    , operationid 
    , SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(EndDateTime,StartDateTime)))) total 
    FROM tblproduction 
GROUP 
    BY operaterid 
    , operationid;