涉及round()和ceiling()的两个SQL查询结果为何存在差异
两个SQL查询结果不一致的核心原因
差异本质是SQL运算受操作数数据类型影响,触发了不同的除法规则,和CEILING(36.3)返回的数值是不是37没有直接关系:
- 第一条查询
SELECT ROUND(CEILING(36.3) / 4,2)的执行流程:CEILING(36.3)计算出的数值确实是37,但因为输入参数36.3是小数字面量,函数返回值是带小数属性的数值类型(实际为37.0这类非整数值类型),不是纯整数类型- 做除法时,一侧是小数类型、一侧是整数4,数据库会先做隐式类型转换,把两边统一成小数类型再计算,得到精确的除法结果9.25
- 最后对9.25做保留两位小数的ROUND处理,最终返回9.25
- 第二条查询
SELECT ROUND(37 / 4,2)的执行流程:- 参与除法的37和4都是整数字面量,两边都是整数类型时,当前环境会直接走整数除法逻辑:截断所有小数部分,只返回整数商,也就是37除以4直接得到整数9
- 后续的ROUND操作是对已经算出的整数9做保留两位小数处理,结果自然还是9,不可能补回之前被截断的0.25
你可以自己做个验证:把第二条查询里的任意一个整数改成小数形式,比如写为
SELECT ROUND(37.0 / 4,2),执行后就会得到和第一条一致的9.25结果。
内容的提问来源于stack exchange,提问作者gyiernahfufie
相关产品推荐
相关产品推荐

