计算MySQL中time(1)类型列平均耗时结果异常求助
解决TIME(1)列平均时间计算偏低的问题
看起来问题出在你对带小数的TIME类型处理时丢失了精度!咱们来拆解一下:
你的原查询用TIME_TO_SEC()转换actualsplit列,但这个函数对于TIME(1)类型的时间(比如00:02:01.9)只会返回整数秒数(也就是121秒),直接丢弃了后面的0.9毫秒部分。当你对这些整数取平均时,自然会忽略掉所有毫秒的贡献,最终结果就会比实际平均值偏低。
修正后的查询
你需要把时间的小数部分也纳入计算,这样才能得到准确的平均值:
SELECT SEC_TO_TIME(AVG(TIME_TO_SEC(`actualsplit`) + MICROSECOND(`actualsplit`) / 1000000)) as average FROM workoutmasterv6 WHERE teamid = ? AND workoutidv2 = ? AND actualsplit <> '00:00:00.0' GROUP BY date ORDER BY date asc
为什么这样有效?
MICROSECOND(actualsplit)会提取出时间的微秒部分,比如00:02:01.9对应的微秒是900000- 除以1000000后就把微秒转换成了秒的小数部分(900000/1000000=0.9)
- 和
TIME_TO_SEC()得到的整数秒相加,就得到了包含完整精度的秒数(121+0.9=121.9) - 对这个完整数值取平均后,再用
SEC_TO_TIME()转换回TIME类型,就能得到准确的平均时间了
另外也可以用更简洁的写法,直接把TIME类型转成数值(MySQL会自动把TIME转成带小数的秒数):
SELECT SEC_TO_TIME(AVG(`actualsplit` + 0)) as average FROM workoutmasterv6 WHERE teamid = ? AND workoutidv2 = ? AND actualsplit <> '00:00:00.0' GROUP BY date ORDER BY date asc
这个写法更直观,效果和上面的查询是一样的。
内容的提问来源于stack exchange,提问作者Neil Bergenroth
相关产品推荐
相关产品推荐

