HIVE中对于时间变换的处理

一、获取月份第一天/最后一天

--需求一:获取月份第一天/最后一天
--方式一:last_day
--获取当月第一天
select date_add(last_day(add_months('2020-06-14',-1)),1);
--获取当月最后一天
select last_day('2020-06-14');

--方式二:floor_month(注:必须转换成时间戳处理!)
--获取当月第一天
select to_date(floor_month(cast('2020-06-14' as timestamp)));
select to_date(floor_month(from_utc_timestamp(unix_timestamp('2020-06-14','yyyy-MM-dd')*1000,'GMT+8')));
--获取当月最后一天
select date_sub(add_months(floor_month(cast('2020-06-14' as timestamp)),1),1);

--方式三:trunc
desc function extended trunc;
--获得当月的第一天
select trunc('2020-06-14','MM');
--获得当月的最后一天
select date_sub(trunc(add_months('2020-06-14',1),'MM'),1);

二、获得年份的第一天/最后一天

--方式一:floor_year获取当年的第一天
--from_unixtime返回'string'型
select to_date(floor_year(cast(from_unixtime(unix_timestamp()) as timestamp)));

--floor_year获取当年的最后一天
select to_date(date_sub(add_months(floor_year(cast(from_unixtime(unix_timestamp()) as timestamp)),12),1));

--方式二:trunc获取当年的第一天/最后一天

--trunc获取当年的第一天
select trunc(from_unixtime(unix_timestamp()),'YYYY');

--trunc获取当年的最后一天
select date_sub(add_months(trunc(from_unixtime(unix_timestamp()),'YYYY'),12),1);

三、获取时间区间中的连续区间日期

--获得时间区间的方法一:
--利用函数关系做变换,逻辑强
select if(year(start_time_t)=year(add_months(start_time_t,12*p)),start_time_t,trunc(add_months(start_time_t,12*p),'YYYY')) start_time_t_sec,
       if(year(stop_time_t)=year(add_months(start_time_t,12*p)),stop_time_t,add_months(date_sub(trunc(add_months(start_time_t,12*p),'YYYY'),1),12)) stop_time_t_sec
from (
         select from_unixtime(unix_timestamp(start_time, 'yyyyMdd'), 'yyyy-MM-dd') start_time_t,
                from_unixtime(unix_timestamp(stop_time, 'yyyyMdd'), 'yyyy-MM-dd')  stop_time_t
         from (
                  select '2015506' start_time,
                         '2022712' stop_time
              ) t1
     )t2
lateral view posexplode(split(space(year(stop_time_t)-year(start_time_t)),' ')) tmp as p,v;

--获得时间区间的方法二:
--拼接写法似乎也差不多代码量,但是逻辑简单
select if(year(start_time_t)=year(add_months(start_time_t,12*p)),start_time_t,concat(year(add_months(start_time_t,12*p)),'-','01-01')) start_time_t_sec,
       if(year(stop_time_t)=year(add_months(start_time_t,12*p)),stop_time_t,concat(year(add_months(start_time_t,12*p)),'-','12-31')) stop_time_t_sec

from (
         select from_unixtime(unix_timestamp(start_time, 'yyyyMMdd'), 'yyyy-MM-dd') start_time_t,
                from_unixtime(unix_timestamp(stop_time, 'yyyyMMdd'), 'yyyy-MM-dd')  stop_time_t
         from (
                  select '20150506' start_time,
                         '20220712' stop_time
              ) t1
     )t2
         lateral view posexplode(split(space(year(stop_time_t)-year(start_time_t)),' ')) tmp as p,v;

该需求的结果显示:

2015-05-06到2022-07-12区间的时间段展示

 总结:

1、月份处理函数:last_day、floor_month、trunc;

2、年份处理函数:floor_year、trunc;

3、时间区间处理函数选择:posexplode、split、space。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值