数据类型转换是一个常见的需求,因为有一些函数、或者运算时,对数据类型有严格要求,所以在做运算前,都需要将数据先进行数据类型的转换,此处就需要用到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_丿潇湘丶书笛的博客-CSDN博客