首页 > 解决方案 > mySQL 获取一天中的平均时间变化

问题描述

考虑具有以下两个时间戳

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

我想找到time他们两个的平均值。

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

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

我稍后在具有两个时间戳的触发器中需要它。当前存储的 ( OLD) 和更新的 ( NEW) 用于计算新的平均时间。

任何建议表示赞赏

标签: mysqltimeaverage

解决方案


当您取两个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值的数值平均值;您的示例相隔 24 小时 20 米。看起来您想要时间的平均值,就好像较早的日期时间在较晚的日期时间的前一天一样。

您可以计算如下:

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);

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

这对于用 SQL 编写来说是一个很大的痛苦,因此创建一个存储函数来处理它可能是有意义的。


推荐阅读