前言
使用hive进行时间处理的过程中,有时忘记一些常用的函数用法,现整理一下hive中常用日期函数,当做备忘录使用,忘记来翻阅一下。
1 时间戳转化日期函数
时间戳必须是10位,默认情况下转化为'yyyy-MM-dd HH:mm:ss'格式日期,若需要转化其他格式日期,需要说明转化日期格式。
select from_unixtime('1566390082'), from_unixtime('1566390082', 'yyyy-MM-dd'), from_unixtime('1566390082', 'yyyyMMdd')2019-08-21 20:21:22 2019-08-21 20190821
2 日期转化为时间戳函数
默认情况下要求日期格式为'yyyy-MM-dd HH:mm:ss',其他格式日期需要说明日期格式,不然结果为NULL
select unix_timestamp('2019-08-21 20:21:22'), ---日期格式为默认格式unix_timestamp('2019-08-21'), ---日期格式不满足'yyyy-MM-dd HH:mm:ss',没有指定日期格式,出错unix_timestamp('2019-08-21', 'yyyy-MM-dd')1566390082 NULL 1566316800
3 日期格式化函数
date_format函数将字符串或者日期转化为指定格式的日期, to_date函数直接将长日期转化为短日期
select date_format('2019-08-21 20:21:22', 'yyyy-MM-dd'), date_format('2019-08-21 20:21:22', 'yyyyMMdd')2019-08-21 20190821
select to_date('2019-08-21 20:21:22'), to_date('2019-08-21 20:21')2019-08-21 2019-08-21
4 获取年、月、日、天、小时、分钟、秒、周数、星期几、季节函数
select year('2019-08-21 20:21:22'), --年month('2019-08-21 20:21:22'),--月day('2019-08-21 20:21:22'),--日hour('2019-08-21 20:21:22'),--小时minute('2019-08-21 20:21:22'),--分钟second('2019-08-21 20:21:22'),--秒weekofyear('2019-08-21 20:21:22'),--第几周dayofweek('2019-08-21 20:21:22'),--星期几ceil(month('2019-08-21 20:21:22')/3)--季节2019 8 21 20 21 22 34 4 3
5 日期(月份)增减函数
日期往后推几天,使用date_add函数,日期往前推几天,使用date_sub函数;
月份往后推几个月,使用add_months函数,参数为正数;月份往前推几个月,参数为负数;
select date_add('2019-08-21',10), date_sub('2019-08-21',10), add_months('2019-08-21',1), add_months('2019-08-21',2), add_months('2019-08-21',-1), add_months('2019-08-21',-2)2019-08-31 2019-08-11 2019-09-21 2019-10-21 2019-07-21 2019-06-21
6 两个日期(月份)相减函数
日期相减使用date_diff函数,返回相差天数,月份相减使用months_between,返回相差月份,不足月为小数
select datediff('2019-08-23', '2019-08-21'), months_between('2019-08-21', '2019-07-25')2 0.87096774
若计算两个之间相差的小时数,可以使用:
select hour('2019-08-23 10:11:12')-hour('2019-08-21 12:20:20') + (datediff('2019-08-23 10:11:12','2019-08-21 12:20:20'))*2446
7 获取月初(月末)、年初(年末)日期
获取月末日期使用last_day函数,获取月初日期使用trunc(,'MM')函数;获取年初日期使用trunc(,‘YY’)函数,使用date_sub(add_months(trunc('', 'YY'),12),1)获取年末日期
select last_day('2019-08-12'), --月末trunc('2019-08-21', 'MM'), --月初trunc('2019-08-21', 'YY'), --年初date_sub(add_months(trunc('2019-08-21', 'YY'),12),1) --年末2019-08-31 2019-08-01 2019-01-01 2019-12-31
8 获取日期的下个星期几的日期
使用函数next_day获取日期下个星期几的日期,参数周一:MO;周二:TU;周三:WE ;周四:TH ;周五:FR ;周六:SA;周日SU
select next_day('2019-08-21', 'MO'), next_day('2019-08-21', 'TU'),next_day('2019-08-21', 'WE'),next_day('2019-08-21', 'TH'),next_day('2019-08-21', 'FR'),next_day('2019-08-21', 'SA'),next_day('2019-08-21', 'SU')2019-08-26 2019-08-27 2019-08-28 2019-08-22 2019-08-23 2019-08-24 2019-08-25