mysql - mySQL 获取一天中的平均时间变化
问题描述
考虑具有以下两个时间戳
"2018-07-12 23:50:00","2018-07-14 00:30:00"
我想找到time
他们两个的平均值。
结果应该是00:10:00
时间。(我对最后的实际日期不感兴趣,只是时间)。
我首先比较哪个更早(连续时间流)但失败了。如果我使用日期进行比较23:50:00
(无论哪个时间)总是更早,因为它也考虑了日期。如果我用时间来比较00:30
总是更早,因为它只考虑时间本身。
我稍后在具有两个时间戳的触发器中需要它。当前存储的 ( OLD
) 和更新的 ( NEW
) 用于计算新的平均时间。
任何建议表示赞赏
解决方案
当您取两个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 编写来说是一个很大的痛苦,因此创建一个存储函数来处理它可能是有意义的。
推荐阅读
- mongodb - Mongo-Kafka 源连接器无法恢复更改流
- email - 根据选择选择案例以通过电子邮件发送不同的工作表
- django-rest-framework - 每当应用搜索时增加模型的计数字段
- javascript - 数组在 for 循环中使用 try catch 工作?(node.js 和 javascript)我收到错误“ReferenceError:p 未定义”
- mongodb - 为什么 mongodb arbiter 需要 dbpath?
- r - 删除两个文本之间的第一位逗号和空格以及最后一个逗号或空格
- python - 堆叠一个 numpy 数组列表
- c++ - Boost property_tree 错误:在 .ini 文件中获取元素时,将数据转换为“j”类型失败
- javascript - 在 Angular 9 中分配表单值
- 2sxc - 2sxc 11 字体图标选择器 Material Icons