0

我有一个 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 中手动平均它们。

4

2 回答 2

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;

于 2013-08-22T14:53:10.413 回答
1

以下查询将排除超过 1 小时的作业运行

SELECT  job_id
        ,AVG(TIMEDIFF(datecol2,datecol1)) 
FROM    test
WHERE   datecol2 < DATE_ADD(datecol1, INTERVAL 1 HOUR)
GROUP BY
        job_id;
于 2013-08-22T14:53:55.150 回答