mysql中format、round、truncate、cast、convert函数详解
作者:smice分类:Java
日期:2021-10-20 19:09:002021-10-20阅读:322

在想dao层查询数据时,有时候会count或者sum某个或某几个字段,如果不是整数的话会进行format、round来四舍五入保留指定小数位数。

round

对数据按照指定位数四舍五入
round(source,num)
1.source 要转换的数据
2.num 要保留的小数位数

用法:

round(2300.532,2)

结果:2300.53

但是有时候round确不生效,如下:

round(sum(if(b.q20='D',b.q5,0)),0)

上面这句sql,理想应该是整数,但当b.q5字段为null时,改语句输出结果是0.0。因为默认mysql会对数据进行隐式转换,如:

select  (1+'1');

mysql会将操作的两个数据类型转换一致,把字符'1'转换为整数型,正是如此,上面round不生效是因为b.q5是varchar类型,当b.q5不为null时mysql能将其sum结果转换为decimal格式,而为null时sum结果也为null。round只能转换decimal类型,所以就必须吧b.q5手动转换为decimal类型。如下所示:

round(cast(sum(if(b.q20='B',b.q5,0))

这样就能避免b.q5为null导致round不生效。

format

format跟round类似,也是进行格式化也具有四舍五入的功能
format(source,num,local);
1.source 需要转换的数据
2.num 需要保留的小数位数
3.分割符的本地设置
如果使用本地语言环境可省略第三个参数

用法:

select format(200,2);

结果:200.00

但是format的转换后返回对象是字符类型,且整数大于三位会用逗号分割,如果是对转换后有运算需求或不需要逗号分割则推荐使用round转换。

truncate

直接切割,不会四舍五入
truncate(source,num)
1.source 要转换的数据
2.num 要保留小数位数

用法:

select truncate(3322.653,0)

结果:3322

cast

将数据显示转换为指定类型
cast(source as type)
1.source 要转换的数据
2.type 目标数据类型
type可以是如下类型:
BINARY[(N)] :二进制字符串,转换后长度小于N个字节( 不足长度N则尾部补上0x00 )
CHAR[(N)] :字符串,转换后长度小于N个字符
DATE :日期
DATETIME :日期时间
DECIMAL[(M[,N])] :浮点数,M为数字总位数(包括整数部分和小数部分),N为小数点后的位数
SIGNED [INTEGER] :有符号整数
TIME :时间
UNSIGNED [INTEGER] :无符号整数

用法:

cast('1' as unsigned)

结果:1

convert

convert与cast功能几乎一致,但用法不同,convert能转换字符集。
convert(source,type)
1.source 要转换的数据
2.目标类型
type可以为以下格式:
二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED

用法:

covert('2021.10.20',date)

结果:2021-10-20

弹幕评论