MySQL查找具有分组依据和排除的平均时间分配

时间:2013-08-22 14:24:20

标签: mysql

我有一个MySQL表,其中包含两个日期时间列:

CREATE TABLE test (job_id int, dateCol1 DATETIME, datecol2 DATETIME);

它包含一系列表示作业开始和结束时间的数据。我需要知道几分钟内这些工作的平均持续时间是多少,但到目前为止还看不到如何实现它。

我尝试过各种各样的事情:

SELECT job_id, AVG(TIMEDIFF(datecol2,datecol1)) FROM test GROUP BY job_id;
SELECT job_id, SEC_TO_TIME(AVG(TIMEDIFF(datecol2,datecol1))) FROM test  GROUP BY job_id;
SELECT job_id, SEC_TO_TIME(AVG(TIME_TO_SEC(datecol2)-TIME_TO_SEC(datecol1))) FROM test GROUP BY job_id;
SELECT job_id, SEC_TO_TIME(AVG(TIME_TO_SEC(FROM_UNIXTIME(UNIX_TIMESTAMP(datecol2)-UNIX_TIMESTAMP(datecol1))))) FROM test GROUP BY job_id;;

我将它与我打印的所有作业列表和Excel中的平均值进行比较,但到目前为止,我得到了不同的结果。

作为补充,我还需要排除任何持续时间超过1小时的地方。

我确定我只是过于复杂,如果有人能告诉我理解的方式,否则我最终不得不打印出每个jobid的列表,并在excel中手动平均它们。

2 个答案:

答案 0 :(得分:1)

您可以使用UNIX_TIMESTAMP获取秒数差异,然后获得平均值。

SELECT job_id, 
       SEC_TO_TIME(AVG(UNIX_TIMESTAMP(datecol2) - UNIX_TIMESTAMP(datecol1))) 
FROM test 
GROUP BY job_id;

如果你需要过滤那些差异大于一小时的那些......

SELECT job_id, 
       SEC_TO_TIME(AVG(UNIX_TIMESTAMP(datecol2) - UNIX_TIMESTAMP(datecol1))) 
FROM test 
WHERE  UNIX_TIMESTAMP(datecol2) - UNIX_TIMESTAMP(datecol1) < 3600 
GROUP BY job_id;

答案 1 :(得分:1)

以下查询将排除大于1小时的作业运行

SELECT  job_id
        ,AVG(TIMEDIFF(datecol2,datecol1)) 
FROM    test
WHERE   datecol2 < DATE_ADD(datecol1, INTERVAL 1 HOUR)
GROUP BY
        job_id;