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