在建表的时候我们常将日期字段设置为INT类型,将诸如20180601
这样的数字值来表示日期,这样在做日期比较等操作时没有问题,但是要进行某些日期计算,就要先转成日期类型才能进行计算了,怎么转换呢?
数据准备
下面在Hive中先建一个表,含有一个INT类型的日期字段,插入两行数据。
create table tb (dt INT);
insert into tb values (20180701);
insert into tb values (20180715);
转换类型
这里第一种方法是将INT
类型的日期值转成STRING
类型,用Hive内置的unix_timestamp
函数转成时间戳类型,最后将时间戳用from_unixtime
转成yyyy-MM-dd
的日期类型。
第二种就比较直接,将INT
类型的日期值转成STRING
类型,再对字符串进行截取处理,用-
拼接起来。
select dt,
from_unixtime(unix_timestamp(cast(dt as string),'yyyyMMdd'),'yyyy-MM-dd') as a,
concat(substr(cast(dt as string),1,4), '-',substr(cast(dt as string),5,2), '-',substr(cast(dt as string),7,2)) as b
from tb;
运行结果
dt | a | b |
---|---|---|
20180701 | 2018-07-01 | 2018-07-01 |
20180715 | 2018-07-15 | 2018-07-15 |
当然,每次都这样写有些费劲,可以在Hive中创建UDF或者宏,转换时进行调用就好了。
创建宏命令
宏命令相对于UDF要简单方便些,但是宏只能是临时宏,只在本次会话中可见、有效。因此你需要将宏脚本放在SQL脚本的头部。
DROP TEMPORARY MACRO IF EXISTS date_trans;
CREATE TEMPORARY MACRO date_trans(dt int)
if(dt is not null and length(dt)=8,
concat(substr(cast(dt as string),1,4), '-',substr(cast(dt as string),5,2), '-',substr(cast(dt as string),7,2)),
null);
--调用
select dt,date_trans(dt) as a from tb;
如果同一个功能的函数或宏命令被多次调用,那维护起来就很方便,语句也简洁很多。