2013-08-22 30 views
0

平均TIMEDIFF我有一个包含两个日期时间列的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中手动取平均值。

+0

此表中是否存在每个job_id的multipe记录,还是每个job_id只有一条记录?你是否想要获得所有job_ids的平均值? –

+0

对不起,每个job_id都有多个条目,并且有apx 100个job_id。我平均每个job_id。 – IGGt

+0

只要被排除在外,是否要排除工作id的平均时间超过一个小时,或者您是否希望排除时间差超过一个小时的任何单个记录被纳入平均计算? –

回答

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; 

+0

我认为我的问题是与Excel比较,而不是专注于SQL是否正确。谢谢指点我在正确的方向 – IGGt

1

后续查询将排除作业运行是大于1小时

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