MySQL获取平均每日更改时间

时间:2018-07-14 14:50:22

标签: mysql time average

考虑具有以下两个时间戳记

"2018-07-12 23:50:00","2018-07-14 00:30:00"

我想找到两个人的平均time

结果应为00:10:00作为时间。 (我对最后的实际日期不感兴趣,只是时间)。

我首先比较哪个更早(连续时间流)但失败了。如果我使用日期比较23:50:00(无论哪个时间),总是比较早,因为它也会考虑日期。如果我用时间比较00:30总是比较早,因为它只考虑时间本身。

稍后,我需要在带有两个时间戳记的 trigger 中进行此操作。当前存储的(OLD)和更新的(NEW)来计算新的平均时间。

任何建议都值得赞赏

1 个答案:

答案 0 :(得分:1)

当取两个DATETIME值的平均值时,实际上是在两个输入值之间的中点计算DATETIME值。

这是对两个DATETIME值进行平均的一种方法。

 SELECT FROM_UNIXTIME((UNIX_TIMESTAMP('2018-07-12 23:50:00')+UNIX_TIMESTAMP("2018-07-14 00:30:00"))2)

之所以可以使用它,是因为Unix时间戳实际上是历史记录中特定时间以来的秒数。它们是数字量,您可以对它们进行算术运算。

然后,如果您只想要平均值的时间部分,则可以使用TIME()函数。

但是,看起来您实际上并不想要两个DATETIME值的数字平均值;您的示例相距24h 20m。看起来您想要平均时间,好像较早的日期时间在较晚的日期时间之前。

您可以按如下方式进行计算:

SET @startSec := TiME_TO_SEC(TIME('2018-07-12 23:50:00'));
SET @endSec := TiME_TO_SEC(TIME('2018-07-14 00:30:00'));
SET @endSec = IF(@startSec > @endSec, @endSec + TIME_TO_SEC('24:00:00'), @endSec);
SET @deltaSec := ((@startSec + @endSec) /2) MOD TIME_TO_SEC('24:00:00') ;
SELECT SEC_TO_TIME(@deltaSec);

处理条件条件的技巧是IF()函数调用。

用SQL编写代码已经非常痛苦,以至于创建一个存储函数来处理它可能很有意义。