hive 相关时间日期函数总结

1. 获取当前时间

大多数SQL中获取当前时间用 now()函数即可,hive则有所不同。

hive 获取当前时区的UNIX时间戳: unix_timestamp()

SELECT unix_timestamp();

如果想要具体当前时间,则要使用UNIX时间戳转日期函数: from_unixtime(),返回值: string

SELECT from_unixtime(unix_timestamp(),"yyyy-MM-dd HH:mm:ss");

不同日期格式示例:

hive> select from_unixtime(1323308943,'yyyy-MM-dd HH:mm:ss');
2011-12-08 09:49:03
hive> select from_unixtime(1323308943,'yyyyMMdd');
20111208
hive> select from_unixtime(1323308943,'yyyy-MM-dd');
2011-12-08
hive> select from_unixtime(1323308943,'yyyy-MM');
2011-12

unix_timestamp还有其他两种用法,unix_timestamp(string date)unix_timestamp(string date, string pattern)。第一个string date必须是“yyyy-MM-dd HH:mm:ss”格式,否则会出错。

hive> select unix_timestamp('2011-12-07 13:01:03');
1323234063
hive> select unix_timestamp('2011-12-07');  
NULL

出现NULL可以考虑使用第二种用法unix_timestamp(string date, string pattern)

hive> select unix_timestamp('20111207 13:01:03','yyyyMMdd HH:mm:ss');
1323234063
hive> select unix_timestamp('2011-12-07 13:05','yyyy-MM-dd HH:mm');
1323234300
hive> select unix_timestamp('2011-12','yyyy-MM');
1322668800

综合使用示例:

select from_unixtime((unix_timestamp('2019-09','yyyy-MM')-1296000),'yyyy-MM'); 
--1296000(表示半个月15天的总秒数)
OK
2019-08

hive 所有函数都只能识别到 天 的时间一级,不能识别到 月 这么大的时间一级。但是,from_unixtimeunix_timestamp 可以识别到 月 一级的时间。

2. 日期加减

(1) 日期比较 datediff 语法: datediff(string enddate, string startdate)
返回结束日期减去开始日期的天数。

hive> select datediff('2012-12-08','2012-05-09');
213

注意:这个相减日期格式必须是“yyyy-MM-dd”,否则结果为NULL。

SELECT datediff('20200103','20200101');
NULL

可以改为

hive> select datediff(to_date(from_unixtime(unix_timestamp('20200103','yyyyMMdd'))),to_date(from_unixtime(unix_timestamp('20200101','yyyyMMdd'))));
2

(2) 日期增加函数: date_add
语法: date_add(string startdate, int days)
返回值: string
说明: 返回开始日期startdate增加days天后的日期。

hive> select date_add('2019-12-08',10);
2019-12-18

(3) 日期减少函数: date_sub
语法: date_sub (string startdate, int days)
返回值: string
说明: 返回开始日期startdate减少days天后的日期。

hive>   select date_sub('2019-12-08',10);
2019-11-28

3. date_format & to_date

语法: date_format(date/timestamp/string ts, string fmt)

hive> select date_format('2015-04-08', 'y');
2015
hive> select date_format('2015-04-08', 'yyyy');
2015
hive> select date_format('2015-04-08', 'yyyy-MM');
2015-04
hive> select date_format('2015-04-08 10:10:01', 'yyyy-MM');
2015-04
hive> select date_format('2015-04-08', 'yyyy-MM-dd');
2015-04-08

日期时间转日期函数: to_date语法: to_date(string timestamp)

hive> select to_date('2011-12-08 10:03:01');
2011-12-08
hive> select to_date('2011-12-08');
2011-12-08
hive> select to_date('2011-12');
NULL

to_date 只能识别到 天 的时间一级。

4. year & month & day & hour & minute & second & weekofyear

(1) 日期转年函数: year语法: year(string date)

返回值: int

说明: 返回日期中的年。

hive> select year('2019-12-08 10:03:01');
2019
hive> select year('2019-12-08');
2019
hive> select year('2019-12');
NULL

year 只能识别到 天 的时间一级。

(2) 日期转月函数: month语法: month (string date)

返回值: int

说明: 返回日期中的月份。

hive> select month('2019-12-08 10:03:01');
12
hive> select month('2019-08-08');
8
hive> select month('2011-08');
NULL

month 只能识别到 天 的时间一级。

(3) day 只能识别到 天 的时间一级

日期转天函数: day语法: day (string date)

返回值: int

说明: 返回日期中的天。

hive> select day('2019-12-08 10:03:01');
8
hive> select day('2019-12-24');
24
hive> select day('2019-12');
NULL

(4) hourminutesecond也是类似的用法。

hive> select hour('2019-12-08 10:03:01');
10
hive> select minute('2019-12-08 10:03:01');
3
hive> select second('2011-12-08 10:03:01');
1

(5) 日期转周函数: weekofyear语法: weekofyear (string date)

返回值: int

说明: 返回日期在当前的周数。

hive> select weekofyear('2011-12-08 10:03:01');
49

5. next_day() (“周”)

在按照周的区间进行统计时,需要识别出周一和周日的日期,此时经常会用到 next_day()
语法:next_day(STRING start_date, STRING day of week)
返回当前当前日期对应的下一个周几对应的日期

-- 2020-08-05是周三
SELECT next_day('2020-08-05','MO');
-- 下一个周一对应的日期:2020-08-10
SELECT next_day('2020-08-05','TU');
-- 下一个周二对应的日期:2020-08-11
SELECT next_day('2020-08-05','WE');
-- 下一个周三对应的日期:2020-08-12
SELECT next_day('2020-08-05','TH');
-- 下一个周四对应的日期:2020-08-06,本周四
SELECT next_day('2020-08-05','FR');
-- 下一个周五对应的日期:2020-08-07,本周五
SELECT next_day('2020-08-05','SA');
-- 下一个周六对应的日期:2020-08-08,本周六
SELECT next_day('2020-08-05','SU');
-- 下一个周日对应的日期:2020-08-09,本周日

如果是想获取当前日期所在周的周一对应的日期,则只需先获取当前日期的下周一对应的日期,然后减去7:

SELECT date_add(next_day('2020-08-05','MO'),-7);

同理,想获取当前日期所在周的周日对应的日期,则只需先获取当前日期的下周一对应的日期,然后减去1天:

SELECT date_add(next_day('2020-08-05','MO'),-1);

6. last_day()、add_months()、trunc() (“月”)

last_day()可以将每个月中的日期变成该月的最后一天(28/29/30/31号)
语法:last_day(STRING date)

SELECT last_day('2020-08-05');
-- 2020-08-31

add_months():返回加减N个月之后对应的日期
trunc():返回当前日期的月初日期

SELECT add_months('2020-08-05',-1);
-- 2020-07-05
SELECT trunc('2020-08-05','MM')
-- 2020-08-01

-- 选取2020-07-05到2020-08-05所有数据
BETWEEN add_months('2020-08-05',-1) AND '2020-08-05'
-- 选取2020-07-01到2020-08-05所有数据
BETWEEN trunc(add_months('2020-08-05',-1),'MM') AND '2020-08-05'

参考链接:
https://cloud.tencent.com/developer/article/1025429

你可能感兴趣的:(sql,hive)