HIVE中对于时间变换的处理

本文介绍了如何使用SQL函数如last_day, floor_month, trunc等获取月份第一天和最后一天,以及如何通过floor_year, trunc处理年份边界。同时展示了两种方法来处理时间区间,涉及posexplode, split和space等技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

--需求一:获取月份第一天/最后一天
--方式一: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。

### Hive时间格式转换方法及函数 #### 转换 Unix 时间戳至指定日期格式 对于将 Unix 时间戳转换成特定格式的日期,在 Hive 查询语句中可以采用 `from_unixtime` 函数来实现。此函数能够接受两个参数:一个是 Unix 时间戳(通常为秒级),另一个则是目标日期格式字符串。例如,给定一个 10 位数的时间戳 `'1566390082'` 可以被转换成不同样式的日期表示形式[^4]。 ```sql SELECT from_unixtime('1566390082', 'yyyy-MM-dd'); ``` 上述 SQL 片段会返回形如 `"2019-08-21"` 的结果集。 #### 字符串类型的日期格式互转 当面对非标准格式存储于表内的字符型字段时,则可通过组合使用 `unix_timestamp` 和 `from_unixtime` 来完成格式间的变换操作。比如存在一列数据其值是以紧凑方式记录下来的年月日信息即 `"yyyyMMdd"` 形式,那么可以通过如下方式将其调整为目标样式 `"yyyy-MM-dd"`: ```sql SELECT from_unixtime(unix_timestamp('20211022', 'yyyyMMdd'), "yyyy-MM-dd"); -- 结果应显示:"2021-10-22" ``` 这里先调用了 `unix_timestamp` 将原始格式解析成为 Unix 时间戳再经由 `from_unixtime` 完成了最终期望的结果输出[^3]。 #### 提日期部分 如果仅需获不含小时分钟秒钟成分的日历日期的话,可利用内置的 `to_date` 方法直接作用在一个完整的 datetime 类型之上即可得到相应 YYYY-MM-DD 表现形式的数据项[^2]。 ```sql SELECT to_date('2015-04-02 13:34:12'); -- 返回:“2015-04-02” ``` 通过这些基本工具的支持,用户可以在 HiveQL 编程环境中灵活处理各种涉及时间和日期的操作需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值