【hive日期函数】hive常用日期函数+扩展

日期函数

1、from_unixtime:转化unix时间戳到当前时区的时间格式 

select from_unixtime(1641044052,'yyyyMMdd');
--输出:20220101

 2.unix_timestamp:转换到UNIX时间戳

--当前时间
select unix_timestamp();
--输出:1665803372

--yyyy-MM-dd HH:mm:ss日期
select unix_timestamp('2022-01-01 13:34:12');
--输出:1641044052

3.to_date:返回时间中的年月日

select to_date('2022-01-01 13:34:12');
--输出:2022-01-01

4.year、month、day、hour、minute、second:返回时间的年、月、日、时、分、秒

--年
select year('2021-12-31 11:32:12');
--输出:2021

--月
select month('2021-12-31 11:32:12');
--输出:12

--日
select day('2021-12-31 11:32:12');
--输出:31

--时
select hour('2021-12-31 11:32:12');
--输出:11

--分
select minute('2021-12-31 11:32:12');
--输出:32

--秒
select second('2021-12-31 11:32:12');
--输出:12

5.weekofyear:返回指定日期所在一年中的星期号,范围为0到53

select weekofyear('2022-05-05');
--输出:18

6.datediff:两个时间参数的日期之差

select datediff('2022-04-09','2022-04-01');
--输出:8

7.date_add:返回开始日期增加n天后的日期

select date_add('2022-04-09',4);
--输出:2022-04-13

 8.date_sub:返回开始日期减少n天后的日期

select date_sub('2022-04-09',4);
--输出:2022-04-05

9.last_day:指定日期字符所在月份的最后一天

select last_day('2022-04-09');
--输出:2022-04-30

10.trunc:为指定元素而截去的日期值

参数: YEAR、YYYY、YY、MON、MONTH、MM

--查询当月第一天MM
select trunc('2020-12-03','MM')
--输出:2020-12-01

--查询当前季度第一天Q
select trunc('2020-12-03','Q')
--输出:2020-10-01

--查询当年第一天YEAR/Y/YYYY
select trunc('2020-12-03','YYYY') 
--输出:2020-12-01

11.date_trunc:

参数:YEAR、YYYY、YY、MON、MONTH、MM、DAY、DD、HOUR、MINUTE、SECOND、WEEK、QUARTER 

select date_trunc("HOUR" ,"2022-12-12T09:32:05.359");
--输出:2022-12-12 09:00:00

12.date_format:对时间日期进行格式化

select date_format('2022-04-08', 'y');
--输出:2022

select date_format('2022-04-08', 'yyyy');
--输出:2022

select date_format('2022-04-08', 'yyyy-MM');
--输出:2022-04

select date_format('2022-04-08 10:10:01', 'yyyy-MM');
--输出:2022-04

select date_format('2022-04-08', 'yyyy-MM-dd');
--输出:2022-04-08

13.current_date、current_timestamp:当前时间

--当前日期,yyyy-MM-dd
select current_date()
--输出:2022-10-15

--返回当前UTC时间(GMT+0)的时间戳,小于北京时间8小时,就是日期时间yyyy-MM-dd HH:mm:ss
select current_timestamp()
--输出:2022-10-15 04:23:01.893

--返回当前的时间
select from_UTC_timestamp(current_timestamp(),"GMT+8")
--输出:2022-10-12 10:14:16.062

14.months_between(x,y):用于计算x和y之间有几个月。如果x在日历中比y早,那么就返回一个负数

select floor(months_between('2022-03-21', '2022-01-10'))
--输出:2

15.add_months(日期,N) :函数可将日期往前、往后推N个月

select add_months('2022-02-28', 3);
--输出:2022-05-31

select add_months('2022-02-28', -3);
--输出:2021-11-30

16.dayofmonth:查询当月第几天、dayofweek:查询周几

--dayofmonth
select dayofmonth('2022-03-21')
--输出:21

--dayofweek(1 = Sunday, 2 = Monday, ..., 7 = Saturday)
select dayofweek('2022-03-21')
--输出:2

17.next_day:取当前天的下一个周一

--取当前天的下一个周一
select next_day('2021-05-28','MO');
--输出:2021-05-31

--取当前周的周一
select date_add(next_day('2021-05-28','MO'),-7);
--输出:2020-11-30

--取当前周的周日
select date_add(next_day('2021-05-28','MO'),-1) this_sun;
--输出:2021-05-30

18.pmod(int a, int b):返回a除b的余数的绝对值

--举例1
select pmod(datediff('2022-01-02','2022-01-01') + 1,7)
--输出:2

--计算今天是周几
case
when pmod(datediff(ref_date,'2018-01-01') + 1,7) = 2 then concat(ref_date,'(周二)')
	 when pmod(datediff(ref_date,'2018-01-01') + 1,7) = 3 then concat(ref_date,'(周三)')
	 when pmod(datediff(ref_date,'2018-01-01') + 1,7) = 4 then concat(ref_date,'(周四)')
	 when pmod(datediff(ref_date,'2018-01-01') + 1,7) = 5 then concat(ref_date,'(周五)')
	 when pmod(datediff(ref_date,'2018-01-01') + 1,7) = 6 then concat(ref_date,'(周六)')
	 else concat(ref_date,'(周日)') end ref_date

19.+ INTERVAL 1 YEAR:日期加一年

select CAST('2022-10-01' AS DATE) + INTERVAL 1 YEAR
--输出:2023-10-01

扩展

1.from_unixtime(unix_timestamp(,),)用法

--获取前一天的日期
select cast(from_unixtime(unix_timestamp('20221001','yyyyMMdd')-1,'yyyyMMdd') as bigint)
--输出:20220930

--转换日期格式
select from_unixtime(unix_timestamp('20211023','yyyyMMdd'),'yyyy-MM-dd')
--输出:2021-10-23

2.当前周属于哪个月

--这周内哪个月份所占天数多就算哪个月
SELECT month(date_sub(next_day('2022-07-29','Mon'),4))
--输出:7

3. 当前周属于哪一周

SELECT 
case when day(date_add(next_day('2022-09-01','Mon'),-4)) <=7 then '第一周'
when day(date_add(next_day('2022-09-01','Mon'),-4)) >7 and day(date_add(next_day('2022-09-01','Mon'),-4))<=14 then '第二周'
when day(date_add(next_day('2022-09-01','Mon'),-4)) >14 and day(date_add(next_day('2022-09-01','Mon'),-4))<=21 then '第三周'
when day(date_add(next_day('2022-09-01','Mon'),-4)) >21 and day(date_add(next_day('2022-09-01','Mon'),-4))<=28 then '第四周'
when day(date_add(next_day('2022-09-01','Mon'),-4)) >28 then '第五周'
end as week_key   --周
--输出:第一周

4.生成连续的天表、小时表、分钟表

1)生成连续的天

---生成连续的天
select
date_add(start_date,pos) as dt
from
(
   select 
  '2022-12-01' as start_date
 ,'2022-12-04' as end_date
)t
lateral view posexplode(split(repeat(',',datediff(end_date,start_date)),',')) tab as pos,val;

输出结果:

dt
2022-12-01
2022-12-02
2022-12-03
2022-12-04

2)生成连续小时

---生成连续的小时
select
from_unixtime(t1.start_time+tab.pos*3600) as continue_time
from
(
    select
    unix_timestamp('2022-12-01 00:00:00') as start_time   ---生成连续小时的开始时间
		,unix_timestamp('2022-12-01 03:00:00') as end_time   ---生成连续小时的结束时间
)t1
lateral view posexplode(split(repeat(',',cast((end_time-start_time)/3600 as int)),',')) tab as pos,val;

输出结果:

continue_time
2022-12-01 00:00:00
2022-12-01 01:00:00
2022-12-01 02:00:00
2022-12-01 03:00:00

3)生产连续分钟

---生成连续的分钟
select
from_unixtime(t1.start_time+tab.pos*60) as continue_time
from
(
    select
    unix_timestamp('2021-12-01 00:00:00') as start_time   ---生成连续分钟的开始时间
		,unix_timestamp('2021-12-01 00:03:00') as end_time   ---生成连续分钟的结束时间
)t1
lateral view posexplode(split(repeat(',',cast((end_time-start_time)/60 as int)),',')) tab as pos,val;

输出结果:

continue_time
2022-12-01 00:00:00
2022-12-01 00:01:00
2022-12-01 00:02:00
2022-12-01 00:03:00

 4)生产连续秒

---生成连续的秒
select
from_unixtime(t1.start_time+tab.pos) as continue_time
from
(
    select
    unix_timestamp('2021-12-01 00:00:00') as start_time   ---生成连续秒的开始时间
		,unix_timestamp('2021-12-01 00:00:03') as end_time   ---生成连续秒的结束时间
)t1
lateral view posexplode(split(repeat(',',cast(end_time-start_time as int)),',')) tab as pos,val;

输出结果:

continue_time
2022-12-01 00:00:00
2022-12-01 00:00:01
2022-12-01 00:00:02
2022-12-01 00:00:03

 5)生产连续月

---生成连续的月
SELECT
	SUBSTR( add_months ( start_date, pos ), 1, 10 ) AS month_key 
FROM
	(SELECT '2023-03-01' AS start_date ) tmp 
	lateral VIEW posexplode ( split ( space( 3 ), '' ) ) t AS pos, val;

输出结果:

month_key
2023-03-01
2022-04-01
2022-05-01
2022-06-01

6)生产今年内的连续月

---生产今年内的连续月
SELECT
	SUBSTR( add_months ( 
	FROM_UNIXTIME( unix_timestamp( SUBSTR( start_date, 1, 4 ), 'yyyy' ))
	, pos ), 1, 10 ) AS month_key 
FROM
	(SELECT concat(substr(add_months('2023-03-01',1),0,4),'-01-01') AS start_date ) tmp 
	lateral VIEW posexplode ( split ( space( 11 ), '' ) ) t AS pos, val ;

输出结果:

month_key
2023-01-01
2022-02-01
2022-03-01

...

5.时间和秒数互相转换

1)当前时间转换成秒数

SELECT
  hour('2023-06-06 12:00:00') * 3600 + minute('2023-06-06 12:00:00') * 60 + second('2023-06-06 12:00:00')
--输出:43200

2)秒数转换为时间(时分秒)

select
  concat(
    case
      when length(cast(floor(43200 / 3600) as string)) = 1 then concat('0', floor(43200 / 3600), ':')
      when length(cast(floor(43200 / 3600) as string)) = 2 then concat(floor(43200 / 3600), ':')
      else '00:'
    end,
    case
      when length(cast(floor(43200 % 3600 / 60) as string)) = 1 then concat('0', floor(43200 % 3600 / 60), ':')
      when length(cast(floor(43200 % 3600 / 60) as string)) = 2 then concat(floor(43200 % 3600 / 60), ':')
      else '00:'
    end,
    case
      when length(cast(floor(43200 % 3600 % 60) as string)) = 1 then concat('0', floor(43200 % 3600 % 60))
      when length(cast(floor(43200 % 3600 % 60) as string)) = 2 then floor(43200 % 3600 % 60)
      else '00'
    end
  )
--输出:12:00:00

你可能感兴趣的:(hive,hadoop,数据仓库,大数据)