MySql 中以毫秒为单位的 AVG 时间

Posted

技术标签:

【中文标题】MySql 中以毫秒为单位的 AVG 时间【英文标题】:AVG Time with miliseconds in MySql 【发布时间】:2019-10-18 15:50:21 【问题描述】:

mysql 的 AVG 时间 (mm:ss.xxx) 有问题 我的代码是:

CREATE TABLE `tempFast` (
  `posicion` int(11) NOT NULL,
  `lapTime` time(3) NOT NULL,
  `id` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;



INSERT INTO `tempFast` (`posicion`, `lapTime`, `id`) VALUES
(1, '00:01:50.964', 1),
(1, '00:01:51.080', 2),
(1, '00:01:52.006', 3),
(1, '00:02:04.749', 4),
(1, '00:01:50.647', 5),
(1, '00:01:50.864', 6),
(1, '00:01:51.626', 7),
(1, '00:01:59.797', 8),
(2, '00:01:50.828', 20),
(2, '00:01:58.812', 21),
(2, '00:01:51.550', 22),
(2, '00:01:51.706', 23),
(2, '00:02:06.219', 24),
(2, '00:02:06.164', 25),
(2, '00:01:50.908', 26),
(2, '00:01:50.922', 27),
(2, '00:01:54.173', 28),
(2, '00:01:51.126', 29),
(2, '00:01:51.607', 30);

然后我将按位置计算平均时间组。假设位置 1 应为 01:53,967,位置 2 应为 01:54,910。

我尝试通过以下查询获取:

SELECT
posicion,
count(*) as cantidad,
SEC_TO_TIME(AVG(TIME_TO_SEC(laptime))) AvgLapTime
FROM `tempFast`
group by posicion

它返回以下错误结果:

posicion    cantidad    AvgLapTime
1              8        00:01:53.3750
2              11       00:01:54.3636

如何使用 Avg 并获得良好的结果?谢谢。

在https://www.db-fiddle.com/f/myTK8u1M72P5Z8NffDjPtV/0,你得到了可以尝试的代码


*** Uueerdo,最后你的指示告诉了我解决这个问题的方法。与 SEC_TO_TIME((AVG(TIME_TO_SEC(laptime) * 1000000 + MICROSECOND(laptime)))/1000000)

【问题讨论】:

如果您将lapTime 存储为以毫秒为单位的整数,而不是time,这可能会更好。 你可以做AVG(TIME_TO_SEC(laptime) * 1000000 + MICROSECOND(laptime)),然后转换回时间。 Uueerdo 谢谢,但我尝试 AVG(TIME_TO_SEC(laptime) * 1000000 + MICROSECOND(laptime)) 或 SEC_TO_TIME(AVG(TIME_TO_SEC(laptime) * 1000000 + MICROSECOND(laptime))) 但结果不是预期的结果(非常高的值)。 Uueerdo,最后你的指示告诉了我管理这个的方法。使用 SEC_TO_TIME((AVG(TIME_TO_SEC(laptime) * 1000000 + MICROSECOND(laptime)))/1000000) 返回预期结果。谢谢你 @pepqq 我添加了一个更彻底的答案,因此您可以将其标记为已解决。 【参考方案1】:

由于 MySQL 没有“到毫秒”函数,一种选择是使用 MICROSECOND() 函数获取小数秒,使用 TIME_TO_SEC() 获取时间的总秒数,然后使用TIME_TO_SEC(laptime) * 1000000 + MICROSECOND(laptime) 获取整微秒。取平均值,然后除以 1000000 回到秒数,然后使用 SEC_TO_TIME() 回到时间数据类型。

SEC_TO_TIME((AVG(TIME_TO_SEC(laptime) * 1000000 + MICROSECOND(laptime)))/1000000)

如果时间很长,您还可以考虑这种变化,其中平均值实际上以毫秒为单位计算:

SEC_TO_TIME((AVG(TIME_TO_SEC(laptime) * 1000 + MICROSECOND(laptime) / 1000))/1000)

【讨论】:

以上是关于MySql 中以毫秒为单位的 AVG 时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中以毫秒为单位获取当前时间?

如何在 Ruby 中以毫秒为单位计时?

如何在 c++ 中以毫秒为单位获得系统启动时间?

想要在存储过程中以毫秒为单位获取两个时间戳的差异

为啥 setDate() 在 nodejs 中以毫秒为单位给出最终日期? [复制]

在 Windows 和 Linux 中以毫秒为单位的随机种子