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