SQL Server使用decimal(10,1)计算时间时结果不一致问题咨询
SQL Server两次时间单位换算结果不一致的原因
你遇到的偏差本质是舍入计算的执行顺序不同导致的误差累计差异,具体拆解如下:
两个查询的计算逻辑差异
- 第一个分组查询的执行顺序:
- 逐行计算单条记录的秒数转小时结果:
单条totalsec / 3600 - 逐行将上述结果舍入保留1位小数:
CAST(结果 AS decimal(10,1)) - 对所有舍入后的小数做求和,再格式化输出
- 逐行计算单条记录的秒数转小时结果:
手动计算逐行舍入后的结果累加值,和第一个查询输出完全匹配:
| 单条秒数 | 换算为小时(精确值) | 舍入保留1位小数 |
|---|---|---|
| 1503 | 0.4175 | 0.4 |
| 893 | ≈0.248 | 0.2 |
| 14524 | ≈4.034 | 4.0 |
| 6631 | ≈1.842 | 1.8 |
| 13 | ≈0.004 | 0.0 |
| 889 | ≈0.247 | 0.2 |
| 4490 | ≈1.247 | 1.2 |
所有舍入后的值相加:0.4+0.2+4.0+1.8+0.0+0.2+1.2 = 7.8
- 第二个直接计算总秒数的查询执行顺序:
- 先对所有秒数求和得到28943
- 直接对总秒数做换算:
28943/3600≈8.0397 - 将上述结果舍入保留1位小数得到8.0,格式化后输出
解决方案
如果需要两次结果一致,统一调整为「先求和再做换算和舍入」即可,修改第一个查询的语句为:
SELECT userid,FORMAT( CAST((SUM(totalsec) / 3600.0) as decimal(10,1)) ,'N1') FROM dbo.MyTable group by userid,cast(udatetime as date)
内容的提问来源于stack exchange,提问作者user16402180
相关产品推荐
相关产品推荐

