这期来讲一下 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 失去咱们想要的日期、工夫。
关键词:大数据培训