mysql直接使用sum(varchar)会导致出现结果出现小数位异常,需要使用cast()函数或者CONVERT()对数据进行格式化,具体如下
Cast(字段名 as 转换的类型 ),其中类型可以为:
CHAR[(N)] 字符型
DATE 日期型
DATETIME 日期和时间型
DECIMAL float型 (DECIMAL (10,2)//设置精度)
SIGNED int
TIME 时间型
-- 错误
SELECT
SUM(price)
FROM
m_user
-- 正确
SELECT TRUNCATE
( SUM( u.price ), 2 )
FROM
m_user u;
-- 正确
SELECT
SUM(TRUNCATE( u.price , 2 ) )
FROM
m_user u;
-- 正确 但是和以上误差0.01
SELECT
sum(cast(price as decimal(18,2)))
FROM
m_user
标注:
1、TRUNCATE函数将expr按照int_expr长度在小数点后按照位数直接进行截取。
实例:SELECT TRUNCATE(200.12567,4); 输出结果:200.1256
2、ROUND函数将expr按照int_expr长度在小数点后按照位数进行四舍五入截取。
实例:SELECT ROUND(200.12567,4); 输出结果:200.1567
3、MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值。
两者具体的语法如下:
CAST(value as type);
CONVERT(value, type);
就是CAST(xxx AS 类型), CONVERT(xxx,类型)。
可以转换的类型是有限制的。这个类型可以是以下值其中的一个: