SELECT AVG (closeTime - createTime)
FROM Deals
WHERE dealid = 123
'closeTime'和'addTime'具有DATETIME(YYYY-MM-DD HH:MI:SS)格式。结果是:
105030215.0000
我应该使用哪个函数将此值转换为DATETIME?
addTime: 12/04/2016 13:06
closeTime: 12/05/2017 16:08
我正在寻找的结果(我在Excel中计算):
29:03:02:15 (DD:HH:MM:SS)
答案 0 :(得分:0)
在MySQL中减去DATETIME
似乎没有在几秒钟内给出它们之间的差异。有了你的两个例子日期,2016-04-12 13:06和2016-05-12 16:08(假设2017年你的问题是一个错字),减去它们会返回100030200,而正确答案是2602920.这是由因数为38.4而且有点。
以秒为单位返回差异的MySQL函数是TIMESTAMPDIFF
,实际上,SELECT TIMESTAMPDIFF(SECOND, '2016-04-12 13:06', '2016-05-12 16:08')
返回正确的秒数。
现在我们需要做的就是将其转换为您的格式。 MySQL有一个内置函数SEC_TO_TIME
排序可以做到这一点,但不幸的是,它不适用于超过839小时的时间段,并且它没有单独列出日期。我们可以通过与其余计算分开计算天数并在剩余天数从差异中减去时使用SEC_TO_TIME
来解决这个问题。
SELECT CONCAT(
TIMESTAMPDIFF(DAY, '2016-04-12 13:06', '2016-05-12 16:08'), ':',
SEC_TO_TIME(TIMESTAMPDIFF(SECOND, '2016-04-12 13:06', '2016-05-12 16:08') % 86400));
-- 30:03:02:00 (DD:HH:MM:SS)
这似乎是正确的答案。虽然您的所需输出为29:03:02:15
,但4月份有30天,输入中没有秒数。
当您使用聚合函数来确定秒数时,我们将无法以秒为单位选择与值分开的值(否则我们将获得部分后的平均天数)平均秒数),所以你必须重写为
SELECT CONCAT(
FLOOR(AVG(TIMESTAMPDIFF(SECOND, createTime, closeTime)) / 86400), ':',
SEC_TO_TIME(AVG(TIMESTAMPDIFF(SECOND, createTime, closeTime)) % 86400))
FROM deals WHERE dealid = 123;
-- 30:03:02:00.0000
现在这包括几分之一秒,因为平均差异可能不是圆秒数。要排除它们,请使用FLOOR
或ROUND
。
SELECT CONCAT(
FLOOR(AVG(TIMESTAMPDIFF(SECOND, createTime, closeTime)) / 86400), ':',
SEC_TO_TIME(ROUND(AVG(TIMESTAMPDIFF(SECOND, createTime, closeTime))) % 86400))
FROM deals WHERE dealid = 123;