Impala数据类型转换cast(可解决小数后长串数字问题)

本文介绍了数据类型转换在SQL中的重要性,特别是cast函数的使用,如将时间转字符串、日期转时间。同时,针对小数精度问题,提出了使用decimal类型来避免长串小数的解决方案,讲解了decimal(m,n)的用法,并给出了实例。此外,还提醒在使用decimal时要注意除数不为0,以防溢出错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据类型转换是一个常见的需求,因为有一些函数、或者运算时,对数据类型有严格要求,所以在做运算前,都需要将数据先进行数据类型的转换,此处就需要用到cast,转为string、timestamp、decimal等等

下面的cast函数的一些用法

-- 时间转字符串
select cast(now() as string) 

-- 日期转时间
select cast('2022-01-01' as timestamp) 

这里顺带分享一下之前遇到的小数后长串数字问题和解决方式:

在计算增长率的时候,我们的计算逻辑基本都是:

计算后保留小数点后4位  -  乘以100  -  加上百分符,一开始我用了round四舍五入,如下:

-- 保留4位小数,四舍五入
select concat(cast(round((16-13)/13 ,4)*100 as string),'%') 

-- 输出
23.080000000000002%

但是很明显,你运行了上面那段代码后,他的结果是:23.080000000000002%,这就跟我们的预期违背了;

虽然批量计算时,有一些数据计算是不会有长串小数的问题,但是只要有,就影响到了用户体验感(我是产品),所以后来我改用cast,直接改成decimal类型,就可以解决小数转字符串后出现上传数字的问题了,代码大致如下

-- 先转decimal,再转string,在拼接%
select concat(cast(cast(12.484542184 as decimal(4,2)) as string),"%")

-- 输出
12.48%

其中,decimal的用法是:

decimal(m,n),其中:m表示显示的最大长度;n表示小数后保留的位数;

也是刚巧遇到的现象,愚笨的我一开始也蒙在鼓里,希望跟我一样遇到这种现象的读者,通过我上面的解释,能解决你的疑惑和问题哈

另外,在使用decimal时,建议此处必须保证除数不为0,否则可能出现报错;如果有兴趣了解原因或遇到报错:UDF ERROR: Decimal expression overflowed;欢迎阅读我的另外一篇博客解决:Impala解决cast导致UDF ERROR: Decimal expression overflowed_丿潇湘丶书笛的博客-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值