Presto hive 时间相关函数使用笔记

近期工作中用到一些时间函数的计算,因为不够熟练,使用后觉得很有必要梳理下近期用到的时间转换函数,便于后期自己可以翻阅笔记。工作环境使用的BI涉及到presto与hive,较多使用的是presto,一般有时候开发写的是hive语句,我拿过来看的时候又需要转为presto的用法,所以会存在用presto和hive的语法对日期进行转换。

1.先了解presto常用的两个时间函数

1)date_parse(string, format) → timestamp      parse函数是把字符串转换成日期
2)date_format(timestamp, format) → varchar    format函数是把日期时间转换成字符串

2. presto 取当前时间 (假如current_date 是8月14日)

select now();                           --精确到今天的时分秒,运行结果August 14, 2021, 5:31 PM
select current_date ;                   --精确到今天的年月日,运行结果August 14, 2021, 12:00 AM
select current_date - interval '1' day; --精确到昨天的年月日,运行结果August 13, 2021, 12:00 AM

3.取当前时间年、月、日 、周几、季度(假如current_date 是8月14日)

select year(current_date); --获得该字段的年份
--2021
select month(current_date); --获得该字段的年份
select day(current_date); --获得该字段的年份
select day(cast('2021-08-14 00:00:00' as timestamp)); --获得该字段的日期(day of month)
select day_of_week(date('2021-08-14')); --获得该日期是本周第几天(今天周六)
select quarter(cast('2021-08-14' as timestamp)) --获得季度 
--3

--以上函数对于date和timestamp类型字段都适用。

3.presto 时间格式转换

select date_parse('20210814','%Y%m%d')   --parse函数是把字符串转换成日期
-- August 14, 2021, 12:00 AM
select date_format(date_parse('20210814','%Y%m%d'),'%Y-%m-%d')  --先转为日期再转为字符串
-- 2021-08-14
select date_format(date_parse('20210814','%Y%m%d'),'%Y%m%d') --格式不一致,结果形式不一致
-- 20210814

注意:如下两者的区别是当前时间current time 已经是时间戳,不需要用date_prase

select date_format(date_parse('20210814','%Y%m%d'),'%Y-%m-%d %H:%i:%s')
 -- 2021-08-14 00:00:00 
select date_format(current_date,'%Y-%m-%d %H:%i:%s')  --将当前日期2021年8月14日转为时间格式
 -- 2021-08-14 00:00:00

4.时间计算

例:当前日期(今天是20210814)减去1个月。 注意时间计算需要先转为时间格式

select date_format(now() -interval '1' month,'%Y%m%d')
--20210714  
select date_format(date_parse('20210814','%Y%m%d') -interval '1' month,'%Y%m%d')
--20210714 
注意:上面例子时间now()是时间格式,所以可以直接加减
下面例子'20210814'是文本格式,所以需先用date_parse转化为标准日期形式再加减

5.时间的加减date_add

date_add(unit,value,timestamp)
函数date_add可对时间进行偏移,参数unit为单位,比如年、月、日,value为偏移量,比如1、-1,如果value为负数,则为往前偏移

例:计算今天(current_date是20210814) 减去13天是哪一天

SELECT CAST(DATE_ADD('day',-13,current_date)as varchar(20))
--2021-08-01
SELECT CAST(DATE_ADD('day',-day(current_date)+1,current_date)as varchar(20))--计算当月第一日
--2021-08-01  
注:其中select day(current_date)是当前日期14
select CAST(DATE_ADD('day',-day(current_date),current_date)as varchar(20)) --计算上个月末最后一日
--2021-7-31
select CAST((DATE_ADD('day',-day(current_date),current_date) - interval '1' month)as varchar(20))--计算上上个月末最后一日
--2021-6-30

6.计算两个时间的差值date_diff

date_diff(unit, timestamp1, timestamp2) 
函数date_diff,用来计算两个时间的差值,算法是timestamp2 - timestamp1,返回的是单位为unit的整数

例1:计算20210702 与今天20210802 之间相差月份数

select date_diff('month', date_parse('20210701','%Y%m%d'),now())