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 时间的主要内容,如果未能解决你的问题,请参考以下文章