Hive日期时间函数总结

这期来讲一下Hive日期和时间函数,因为在一些业务的分析当中,经常要接触到一些和时间有关的分析,例如最近几个月,某项指标的变化情况,那么日期和时间函数还是需要掌握的。
下面这个我是按照2021-05-27日期来做的例子:

-- 当前日期:

select current_date();
结果:2021-05-27

-- 当前时间:

select current_timestamp();
结果:2021-05-27 15:54:56.052 PRC

select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:dd:ss');
结果:2021-05-27 16:27:30

--当前时间戳:

select unix_timestamp();
结果:1622102134

--时间戳转日期:

select from_unixtime(1622102134,'yyyy-MM-dd HH:dd:ss');
结果:2021-05-27 15:27:34

-- 昨天日期:

select date_sub(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),1);
结果:2021-05-26

-- 明天日期:

select date_add(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),1);
结果:2021-05-28

-- 前两天日期:

select regexp_replace(to_date(date_sub(from_unixtime(unix_timestamp()),2)),'-','')
结果:2021-05-25

--两个日期之间差值(差值为天数):

select datediff('2021-05-28','2021-05-26');
结果:2

--字符串转时间:

select to_date('2021-05-01 11:00:12');
结果:2021-05-01

--转换日期格式:

select date_format(current_date(),'yyyyMMdd');
结果:20210527

--utc时间转换:

select from_utc_timestamp(current_timestamp(),'PRC');
结果:2021-05-28 00:52:07.000

--获取秒:

select second('2021-05-27 16:52:07');
结果:7

--获取分:

select minute('2021-05-27 16:52:07');
结果:52

--获取时:

select hour('2021-05-27 16:52:07');
结果:16

--获取天:

select day('2021-05-27 16:52:07');
结果:27

--获取周:

select weekofyear('2021-05-27 16:52:07');
结果:21

--获取月:

select month('2021-05-27 16:52:07');
结果:5

--获取年月:

select substr(regexp_replace(to_date(from_unixtime(unix_timestamp())),'-',''),1,6);
结果:202105

--获取季度:

select quarter('2021-05-27 16:52:07');
结果:2

--获取年:

select year('2021-05-27 16:52:07');
结果:2021

--两个日期相差多少小时:

select (unix_timestamp('2021-05-27 12:24:12') - unix_timestamp('2021-05-23 08:01:55'))/3600
结果:100.37

--上周第一天:

select date_add(next_day(current_timestamp(),'MO'),-7);
结果:2021-05-24

--上月第一天:

select trunc(add_months(current_timestamp(),-1),'MM');
结果:2021-04-01

--上月第一天:

select concat(substr(add_months(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),-1),1,7),'-01');
结果:2021-04-01

--上月最后一天:

select date_sub(trunc(current_timestamp(),'MM'),1);
结果:2021-04-30

--当月第一天:

select trunc(current_timestamp(),'MM');
结果:2021-05-01

--当月第一天:

select date_sub(current_date,dayofmonth(current_timestamp())-1);
结果:2021-05-01

--当月最后一天:

select last_day(current_timestamp());
结果:2021-05-31

--当月第几天:

select dayofmonth(current_timestamp());
结果:27

--当年第一天:

select trunc(current_timestamp(),'yy');
结果:2021-01-01

--下周第一天:

select next_day(current_timestamp(),'MO');
结果:2021-05-31

--下月第一天:

select add_months(current_timestamp(),1)
结果:2021-06-01

--下月最后一天:

select last_day(add_months(current_timestamp(),1));
结果:2021-06-30

--上季度第一天:

select add_months(concat(year(CURRENT_DATE),'-',substr(concat('0',floor((month(CURRENT_DATE)+2)/3)*3+1),-2),'-01'),-6);
结果:2021-01-01

--本季度第一天:

select add_months(concat(year(CURRENT_DATE),'-',substr(concat('0',floor((month(CURRENT_DATE)+2)/3)*3+1),-2),'-01'),-3);
结果:2021-04-01

select to_date(concat(year(current_timestamp()),'-',lpad(ceil(month(current_timestamp())/3)*3-2,2,0),'-01'));
结果:2021-04-01

--本季度最后一天:

select last_day(to_date(concat(year(current_timestamp()),'-',lpad(ceil(month(current_timestamp())/3)*3,2,0),'-01')));
结果:2021-06-30

--字符拼接:

select concat('2019','05','11');
结果:20190511

--字符截取:

select substr('2019-05-01',0,7);
结果:2019-05

--英文日期转换:

select from_unixtime((unix_timestamp('201509','yyyyMM')),'MMM-YY');
Sep-15

总结:unix_timestamp能够算出时间戳,unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。from_unixtime能够进行格式转换,所以我们需要掌握基本的时间、日期的格式。年、季度、月、日、时、分、秒等等这些基本的函数就简单很多。日期差datediff应该广泛。其他的小时、分钟等等就用时间戳相减然后除以相应的值就行。date_add和date_sub,日期的相加减,trunc截取函数较为有用。last_day、next_day、add_months对于判断月初、月末、周初、周末这样的非常有用。最后就是可以通过字符串的截取substr和组合concat得到我们想要的日期、时间。

关键词:大数据培训

posted @ 2022-02-09 11:50  Linux运维阿铭  阅读(1782)  评论(0编辑  收藏  举报