这期来讲一下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得到我们想要的日期、时间。
关键词:大数据培训