Hive常见时间日期函数的使用与问题整理

打印 上一主题 下一主题

主题 667|帖子 667|积分 2001

这里整理一下Hive常见的时间函数和日期函数和用法,作为平时数据处理过程的一个检索和记录。
平时在数据处理过程中,如果不经常使用时间函数,一时间遇到一些时间上的处理,难免会想不起来。
hive本身提供的时间函数已经很丰富了,基本上能满足我们所有的需求,一些特殊需求也可以通过增加一些数学逻辑实现出来。
接下来看一下类别的日期和时间函数的使用方式。
1.时间戳和日期相互转换函数

具体执行结果在后面备注标注出来。主要为时间戳转换为日期函数,和将日期转换为时间戳函数
  1. -- 1.时间戳转化为日期函数
  2. -- from_unixtime(bigint unixtime[, string format]) 其中第一个参数必须为bigint类型
  3. select from_unixtime(1661084482)                -- 2022-08-21 20:21:22  
  4. select from_unixtime(1661084482, 'yyyy-MM-dd')  -- 2022-08-21  
  5. select from_unixtime(1661084482, 'yyyyMMdd')         -- 20220821
  6. select from_unixtime(1661084482,'yyyy-MM-dd HH:mm:ss')                -- 2022-08-21 20:21:22  
  7. -- 2.将日期转换为时间戳
  8. select unix_timestamp('2022-08-21 20:21:22')                -- 1661084482  
  9. select unix_timestamp('20220821','yyyyMMdd')        -- 1661011200
  10. select unix_timestamp('2022-08-21', 'yyyy-MM-dd')        -- 1661011200
复制代码
2.获取当前天的相关函数

获取当天时间的三种方式,注意格式,其中current_timestamp返回的时间为UTC时间。
  1. -- 返回当天三种方式,格式有一定的不同
  2. select current_date         -- 2023-06-14
  3. select current_timestamp         -- 返回时分秒 2023-06-14 07:56:14.28
  4. select from_unixtime(unix_timestamp())                 -- 2023-06-14 15:56:14
复制代码
3.日期格式化函数

日期格式化函数,需要什么格式,后面写什么格式的日期字符串描述,to_date仅有一种格式返回结果
  1. -- 需要什么格式,后面写什么格式的日期字符串描述
  2. select date_format('2022-08-21 20:21:22', 'yyyy-MM-dd')        -- 2022-08-21  
  3. select date_format('2022-08-21 20:21:22', 'yyyyMMdd')                -- 20220821
  4. select date_format('2022-08-21', 'yyyy-MM-dd HH:mm:ss') -- 2022-08-21 00:00:00
  5. -- 获取时间日期的日期部分
  6. select to_date('2022-08-21 20:21:22')                -- 2022-08-21
复制代码
4.获取年、月、日、天、小时、分钟、秒、周数、星期几、季节函数

hive提供了灵活获取年、月、日、天、小时、分钟、秒、周数、星期几、季节的函数,最后面还提供了一个通过数学函数转换获取季度的逻辑,可以看出其实部分函数如果版本不支持,我们可以通过其他方式曲线获取。当然,不提倡,可读性差。
  1. -- 获取年
  2. select year('2022-08-21 20:21:22')                -- 2022
  3. -- 获取月
  4. select month('2022-08-21 20:21:22')                -- 8
  5. -- 获取当前天
  6. select day('2022-08-21 20:21:22')                        -- 21
  7. -- 每月第几天,同day()
  8. select dayofmonth('2022-08-21 20:21:22')                -- 21
  9. -- 获取当前小时
  10. select hour('2022-08-21 20:21:22')                        -- 20
  11. -- 获取当前分钟
  12. select minute('2022-08-21 20:21:22')                -- 21
  13. -- 获取当前秒
  14. select second('2022-08-21 20:21:22')                 -- 22
  15. -- 活跃当前日期是本年第几周
  16. select weekofyear('2022-08-21 20:21:22')                -- 31
  17. -- 获取当前天是本周第几天,计算日历是从星期天为本周第一天开始计算。如果想要计算星期1为第一天,可以在当前天加1天再去计算。
  18. select dayofweek('2022-08-21 20:21:22')                -- 1
  19. -- 获取当前日期是第几季度
  20. select quarter('2022-08-21 20:21:22')                -- 3
  21. -- 如果有hive因版本不支持部分函数,可以通过数学转换计算,例如当前是第几季度。
  22. select ceil(month('2022-08-21 20:21:22')/3)        -- 季节 3 数学转换
复制代码
5.日期和月份的加减相关函数

获取日期和月份的加减操作,灵活处理日期和月份增加减少,日期月份之间互相求差值。
  1. -- 日期增加日
  2. select date_add('2022-08-21',10) -- 增加日        2022-08-31
  3. -- 日期减少日
  4. select date_sub('2022-08-21',10) -- 减少日         2022-08-11
  5. -- 月增加
  6. select add_months('2022-08-21',2) -- 增加月         2022-10-21
  7. -- 月减少
  8. select add_months('2022-08-21',-1) -- 减少月        2022-07-21
  9. -- 两个日期相减函数
  10. select datediff('2022-08-23', '2022-08-21')        -- 2
  11. -- 两个月份相减
  12. select months_between('2022-08-21', '2022-07-25')        -- 0.871
复制代码
6.获取一些指定特殊日期的函数

主要是获取指定日期的月初(月末)、年初(年末)日期和获取指定日期的下个星期几的日期
  1. -- 获取指定日期的月初(月末)、年初(年末)日期
  2. select last_day('2023-06-13')  -- 月末        2023-06-30
  3. select trunc('2023-06-13', 'MM')  -- 月初        2023-06-01
  4. select trunc('2023-06-13', 'YY')  -- 年初        2023-01-01
  5. select date_sub(add_months(trunc('2023-06-13', 'YY'),12),1) -- 年末        2023-12-31
  6. -- 获取指定日期的下个星期几的日期
  7. select next_day('2023-06-13', 'MO')    -- 2023-06-19
  8. select next_day('2023-06-13', 'TU')    -- 2023-06-20
  9. select next_day('2023-06-13', 'WE')    -- 2023-06-14
  10. select next_day('2023-06-13', 'TH')    -- 2023-06-15
  11. select next_day('2023-06-13', 'FR')    -- 2023-06-16
  12. select next_day('2023-06-13', 'SA')    -- 2023-06-17
  13. select next_day('2023-06-13', 'SU')    -- 2023-06-18
复制代码
7.时区转换函数操作

时区转换函数有很多需要注意的点,其也可以联合使用,简单说一下时区,UTC是世界标准时间。
东一区 GMT+1,东八区GMT+8以此类推,西一区GMT-1,西七区GMT-7以此类推。
时间戳没有时区属性,同一时刻时间戳一致。
  1. -- 将utc时间转换为东八区时间。输入为utc时间字符串,结果为东八区时间字符串
  2. select from_utc_timestamp('2023-06-14 15:56:14','GMT+8')                -- 2023-06-14 23:56:14
  3. -- 将utc时间戳转换为东八区时间,输入为utc时间戳,结果为东八区时间字符串,时间戳没有时区属性,同一时刻时间戳一致
  4. select from_utc_timestamp(cast(1686729374000 as bigint),'GMT+8')                -- 2023-06-14 15:56:14
  5. -- 将指定时区时间转换成utc时间
  6. select to_utc_timestamp('2023-06-14 15:56:14','GMT+8')                -- 2023-06-14 07:56:14
  7. -- 将指定时区时间的时间戳转换成utc时间(这种使用方式不常见,是错误的,只是在某些时刻进行数据转换用,不建议使用)
  8. select to_utc_timestamp(cast(1686729374000 as bigint),'GMT+8')        -- 2023-06-13 23:56:14
  9. -- 正确的转换时间戳为utc时间的方式
  10. select to_utc_timestamp(cast(1686729374000 as bigint),'UTC')
复制代码
以上内容为日期时间函数的常见使用方法及注意事项,有需要可以收藏。
一些函数可以搭配使用,满足生产环境中的时间需求。
下一期:HiveSQL在使用聚合类函数的时候性能分析和解读
按例,欢迎点击此处关注我的个人公众号,交流更多知识。
后台回复关键字 hive,随机赠送一本鲁边备注版珍藏大数据书籍。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表