MySQL 对平均值和日期时间的计算不准确
MySQL innacurate calculation with average and datetime
我在计算时间平均值时遇到问题。我有一个有很多记录的table,table结构是用户id,工作的开始和结束时间(如果你想要,你可以download the table script here),我需要得到每个用户的平均有效工作时间,所以我是这样计算平均值的:
select iduser, sec_to_time(avg(timestampdiff(second, begin, end)))
from test
group by iduser;
到目前为止一切顺利,returns:
USER1 00:25:55.9327
USER2 05:47:44.8713
USER3 03:13:43.4724
但是,问题是当我尝试计算所有用户的平均值(不分组)时:
select sec_to_time(avg(timestampdiff(second,begin, end))),avg(timestampdiff(second,begin, end))
from test;
它 returns '03:26:18.9014',但根据我的计算,它应该 return 03:09:07.333。我检查了常数值和 excel test
select sec_to_time((time_to_sec("00:25:55.9327")+time_to_sec("05:47:44.8713")+time_to_sec("3:13:43.4724"))/3);
到目前为止我不明白为什么它是 return'03:26:18.9014',根据其他计算,它是不准确的。有人知道为什么会这样吗?
如果你运行这个查询
select count(iduser) as cnt,
sum(timestampdiff(SECOND, `begin`, `end`)) as tot,
avg(timestampdiff(SECOND, `begin`, `end`)) as aver,
sec_to_time(avg(timestampdiff(SECOND, `begin`, `end`))) as tim
from test ;
结果
cnt tot aver tim
2903 35935951 12378.9015 03:26:18.9014
你得到了所有的部分,这样你就可以自己计算,结果看起来是正确的
我明白了,这是统计数学基础,如果组中的记录数不同,我无法得到相同的结果,每个用户必须有相同的记录数
我在计算时间平均值时遇到问题。我有一个有很多记录的table,table结构是用户id,工作的开始和结束时间(如果你想要,你可以download the table script here),我需要得到每个用户的平均有效工作时间,所以我是这样计算平均值的:
select iduser, sec_to_time(avg(timestampdiff(second, begin, end)))
from test
group by iduser;
到目前为止一切顺利,returns:
USER1 00:25:55.9327
USER2 05:47:44.8713
USER3 03:13:43.4724
但是,问题是当我尝试计算所有用户的平均值(不分组)时:
select sec_to_time(avg(timestampdiff(second,begin, end))),avg(timestampdiff(second,begin, end))
from test;
它 returns '03:26:18.9014',但根据我的计算,它应该 return 03:09:07.333。我检查了常数值和 excel test
select sec_to_time((time_to_sec("00:25:55.9327")+time_to_sec("05:47:44.8713")+time_to_sec("3:13:43.4724"))/3);
到目前为止我不明白为什么它是 return'03:26:18.9014',根据其他计算,它是不准确的。有人知道为什么会这样吗?
如果你运行这个查询
select count(iduser) as cnt,
sum(timestampdiff(SECOND, `begin`, `end`)) as tot,
avg(timestampdiff(SECOND, `begin`, `end`)) as aver,
sec_to_time(avg(timestampdiff(SECOND, `begin`, `end`))) as tim
from test ;
结果
cnt tot aver tim
2903 35935951 12378.9015 03:26:18.9014
你得到了所有的部分,这样你就可以自己计算,结果看起来是正确的
我明白了,这是统计数学基础,如果组中的记录数不同,我无法得到相同的结果,每个用户必须有相同的记录数