hive中的时间类型有两种:date 和 timestamp。date只存储日期,timestamp则存储纳秒级别的时间戳。当需要存储小时及更精细的时间的时候,就只能使用timestamp了。
然而在实践中,发现一个问题,存好存,但是在使用方面有一些不太好用。
一、建表及插入数据
这里图方便就测试表了:
create table test(
dt timestamp
)
insert into test values('2020-12-12 13:14:15')
尝试插入时间戳方式:
insert into test values(1430816254)
这种方式插入也不报错,执行成功了,但是查询的时候,显示插入的数据为NULL。很疑惑…本篇文章不考虑这个。
二、如何格式化timestamp
最近有一个需求,需要把dt字段格式化成yyyy-MM-dd HH
的形式。像刚才插入的数据 2020-12-12 13:14:15
,应该显示为2020-12-12 13
,本身我以为会有一个函数,我指定字段和yyyy-MM-dd HH
就好,但是找了半天竟然没有这么个函数…
后来我测试了一下,有下面这么几种办法:
1. substr
对,你没看错,这个方法可以直接操作timestamp字段。
当你直接查询timestamp类型的字段时,他现实的格式是 年-月-日 时:分:秒 毫秒
。
而你可以默认该字段都是这种格式的字符串,然后使用substr方法进行操作。
substr方法如何使用请百度。
但是这种方法调整格式很难,难不成你截取以后再拼接么…
2. from_unixtime 和 unix_timestamp 组合使用
我一开始就想到了这两个方法,但是遗憾的是,unix_timestamp
最终得到的结果是一个时间戳,而from_unixtime
则是把时间戳转换成指定格式的字符串,这两个方法都不能直接对 timestamp 类型的字段进行操作。但是这两个方法组合一下,就可以了。
select from_unixtime(unix_timestamp(dt),'yyyy-MM-dd') from test;
其实就是 先把 timestamp 转化为 时间戳,然后再把时间戳转化为指定格式的字符串。