单位用Bex5平台进行应用的快速开发,而该平台用的不是SQL,而是KSQL,因此存在和一般SQL不一样的函数限制。
另外,SQL中默认的Round函数也是四舍六入五成双,用一般的round函数,遇到比如1.050这种情况,2位Round的结果是1.05,也就是舍五不进位,不是我们想要的。
MySQL中可以通过Cast的方法,用数据类型转换成decimal并指明小数位数的方式来实现真正的四舍五入,但是KSQL中不能使用CAST函数。
考虑到CAST函数完成的作业本质是数据类型转换,因此尝试用Convert达成相同效果,结果成功。
sql.convert(1.050,sql.decimal(10,2))
如果是正常SQL的话,把上面的sql.去掉即可。
补充最近又遇到个情况,让我对MySql的四舍五入有了更深刻的理解。 其实Round本身是没问题的,错就错在计算机内部的浮点误差。这种误差很可能是无法直接观察到的,特别是对于计算字段,最终存储在数据库的仍然是正常数字,但是四舍五入就是不进位(末尾为5,保留到原始点数-1的情况最可能出现。) 用相同的静态数字Round也是没有问题的,但结果相同的计算公式Round就是不进位。 之前说的Decimal对这种情况是有效的,但是如果遇到进位点数是变量的情况,Decimal内部再嵌套变量试下来是不行的,所以最终总结可行的解决方法。
方法一:Decimal适用于进位要求为静态的简单情况。 例子:convert({your number or formular}.Decimal(10,6))
方法二:+(spot+1)*0.1比如8位小数进到7位,进位前就加0.00000001
方法三:两次Round注意Sql的round是从外到里的,比如8进7,这种情况的写法应该是round(round({your number or formular},7),8) 这里面的8和7都可以设置为变量。