最近做了一些mysql转换为hive sql的工作,发现hive sql不支持INTERVAL操作,对于hive sql需要的时间需要进行简单的操作,总结一下:
1.hive sql获取当前时间
1)获取时间戳
unix_timestamp()
2)获取指定格式的时间
from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss')
2.获取过去一分钟的时间
例:现在是2019-10-1 12:06:12
获取2019-10-1 12:05:12的时间
1)获取过去一分钟的时间戳
时间戳的机制是没过1秒,时间戳+1,所以获取上一分钟的时间戳,可以在现在时间的时间戳的基础上减去60
unix_timestamp('2019-10-1 12:06:12') - 60
2)获取上一秒的指定时间格式
from_unixtime(unix_timestamp('2019-10-1 12:06:12') - 60,'yyyy-MM-dd HH:mm:ss')
3.获取上一个月的时间
1)通过时间戳加减获取
from_unixtime(unix_timestamp() - 60 * 60 * 24 * 30,'yyyy-MM-dd HH:mm:ss')
2)通过字符串拼接
concat(from_unixtime(unix_timestamp(),'yyyy-'),month(from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss')) -1)
4.获取过去一分钟
例:现在是2019-10-1 12:06:12
获取2019-10-1 12:05:00的时间
开始的思路:
hive存在提取时间年,月,日的时间函数。
select year('2015-04-02 11:32:12');
输出:2015
select month('2015-12-02 11:32:12');
输出:12
select day('2015-04-13 11:32:12');
输出:13
select hour('2015-04-13 11:32:12');
输出:11
select minute('2015-04-13 11:32:12');
输出:32
select second('2015-04-13 11:32:56');
输出:56
所以我想获取的分钟数下减1,再进行字符串拼接。但是会出现如下的问题:
在这里插select concat(concat(from_unixtime(unix_timestamp('2019-10-1 12:00:12'),'yyyy-MM-dd HH:'),minute(from_unixtime(unix_timestamp('2019-10-1 12:00:12'),'yyyy-MM-dd HH:mm:ss'))-1),':00');
输出:2019-10-01 12:-1:00
这是不合法的,所以需要进行时间戳转化才可以。
select concat(concat(from_unixtime(unix_timestamp('2019-10-1 12:00:12'),'yyyy-MM-dd HH:'),minute(from_unixtime(unix_timestamp('2019-10-1 12:00:12') - 60,'yyyy-MM-dd HH:mm:ss'))),':00');
输出:2019-10-01 12:59:00