考虑具有以下两个时间戳记
"2018-07-12 23:50:00","2018-07-14 00:30:00"
我想找到两个人的平均time
。
结果应为00:10:00
作为时间。 (我对最后的实际日期不感兴趣,只是时间)。
我首先比较哪个更早(连续时间流)但失败了。如果我使用日期比较23:50:00
(无论哪个时间),总是比较早,因为它也会考虑日期。如果我用时间比较00:30
总是比较早,因为它只考虑时间本身。
稍后,我需要在带有两个时间戳记的 trigger 中进行此操作。当前存储的(OLD
)和更新的(NEW
)来计算新的平均时间。
任何建议都值得赞赏
答案 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编写代码已经非常痛苦,以至于创建一个存储函数来处理它可能很有意义。