首页 hive时间函数
文章
取消

hive时间函数

对日期、时间的操作是 hive 上重要的一个操作,有一些细节总是容易混淆,在此整理记录一下。

TIMESTAMP

hive 中会有timestamp数据类型的数据,现在普遍存了 BIGINT 的类型,在之后转换的时候非常的麻烦。

DATE_FORMAT

日期 & 时间格式化 Hive wiki

格式化属性

LetterDate or Time ComponentPresentationExamples
GEra designatorTextAD
yYearYear2019; 19
YWeek yearYear2019; 19
MMonth in yearMonthJanuary; Jan; 01
wWeek in yearNumber3
WWeek in monthNumber3
DDay in yearNumber15
dDay in monthNumber15
FDay of week in monthNumber3
EDay name in weekTextTuesday; Tue
uDay number of week (1 = Monday, …, 7 = Sunday)Number2
aAm/pm markerTextPM
HHour in day (0-23)Number23
kHour in day (1-24)Number23
KHour in am/pm (0-11)Number0
hHour in am/pm (1-12)Number12
mMinute in hourNumber00
sSecond in minuteNumber00
SMillisecondNumber0
zTime zoneGeneral time zoneChina Standard Time; CST; GMT+08:00
ZTime zoneRFC 822 time zone+0800
XTime zone  
YYearYear2019
YYYearYear20
YYYYearYear2019
YYYYYearYear2019
MMonth in yearMonth1
MMMonth in yearMonth01
MMMMonth in yearMonthJan
MMMMMonth in yearMonthJanuary

格式化例子

1
2
3
4
5
6
7
8
9
SET time='2019-01-15 23:00:00';

SELECT DATE_FORMAT(${hiveconf:time}, 'YYYY-MM-dd HH:mm:ss');

SELECT DATE_FORMAT(${hiveconf:time}, 'YY-MMMM-dd hh:mm:ss a Z');

--------------------------------------------------
2019-01-15 23:00:00
19-January-15 11:00:00 PM +0800

CURRENT_DATE

获取当前日期

-- 当前日期
SELECT CURRENT_DATE();

-- 昨天日期
SELECT DATE_FORMAT(DATE_SUB(CURRENT_DATE(), 1), 'yyyy-MM-dd')

--------------------------------------------------
2019-01-15
2019-01-14

TO_DATE

日期时间转日期函数

SET time='2019-01-15 01:02:03';

SELECT TO_DATE(${hiveconf:time});

--------------------------------------------------
2019-01-15

FROM_UNIXTIME

转化 unix 时间戳到当前时区的时间格式

1
2
3
4
select FROM_UNIXTIME(1547485323);

--------------------------------------------------
2019-01-15 01:02:03

UNIX_TIMESTAMP

获取当前时间 unix 时间戳

1
2
3
4
5
6
7
8
9
SET time='2019-01-15 01:02:03';

SELECT UNIX_TIMESTAMP();

SELECT UNIX_TIMESTAMP(${hiveconf:time});

--------------------------------------------------
1547606876
1547485323

YEAR & MONTH & DAY & HOUR & MINUTE & SECOND & WEEKOFYEAR

  • YEAR 返回日期中的年

  • MONTH 返回日期中的月

  • DAY 返回日期中的日

  • HOUR 返回日期中的时

  • MINUTE 返回日期中的分

  • SECOND 返回日期中的秒

  • WEEKOFYEAR 返回日期当前周

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SET time='2019-01-15 01:02:03';

SELECT CONCAT('日期中的年:', YEAR(${hiveconf:time}));

SELECT CONCAT('日期中的月:',MONTH(${hiveconf:time}));

SELECT CONCAT('日期中的日:',DAY(${hiveconf:time}));

SELECT CONCAT('日期中的时:',HOUR(${hiveconf:time}));

SELECT CONCAT('日期中的分:',MINUTE(${hiveconf:time}));

SELECT CONCAT('日期中的秒:',SECOND(${hiveconf:time}));

SELECT CONCAT('日期当前周:',WEEKOFYEAR(${hiveconf:time}));

--------------------------------------------------
日期中的年:2019
日期中的月:1
日期中的日:15
日期中的时:1
日期中的分:2
日期中的秒:3
日期当前周:3

DATE_ADD

返回日期后 n 天的日期

1
2
3
4
5
6
SET dt='2019-01-15';

SELECT DATE_ADD(${hiveconf:dt}, 7);

--------------------------------------------------
2019-01-22

DATE_SUB

返回日期前 n 天的日期

1
2
3
4
5
6
SET dt='2019-01-15';

SELECT DATE_SUB(${hiveconf:dt}, 7);

--------------------------------------------------
2019-01-08

DATEDIFF

计算开始日期减去结束日期的天数

1
2
3
4
5
6
SET dt='2019-01-15';

select DATEDIFF(${hiveconf:dt}, '2019-01-31');

--------------------------------------------------
-16

时间计算

上周一

1
2
3
4
5
6
SET dt='2019-01-15';

SELECT DATE_SUB(${hiveconf:dt}, CAST(DATE_FORMAT(${hiveconf:dt}, 'u') AS INT) + 6);

--------------------------------------------------
2019-01-07

本周一

1
2
3
4
5
6
SET dt='2019-01-15';

SELECT DATE_SUB(${hiveconf:dt}, CAST(DATE_FORMAT(${hiveconf:dt}, 'u') AS INT) - 1);

--------------------------------------------------
2019-01-14

下周一

1
2
3
4
5
6
SET dt='2019-01-15';

SELECT DATE_SUB(${hiveconf:dt}, CAST(DATE_FORMAT(${hiveconf:dt}, 'u') AS INT) - 8);

--------------------------------------------------
2019-01-21

上月初

1
2
3
4
5
6
SET dt='2019-01-15';

SELECT ADD_MONTHS(TRUNC(${hiveconf:dt}, 'MM'), -1);

--------------------------------------------------
2018-12-01

本月初

1
2
3
4
5
6
SET dt='2019-01-15';

SELECT TRUNC(${hiveconf:dt}, 'MM');

--------------------------------------------------
2019-01-01

下月初

1
2
3
4
5
6
SET dt='2019-01-15';

SELECT ADD_MONTHS(TRUNC(${hiveconf:dt}, 'MM'), 1);

--------------------------------------------------
2019-02-01

上月末

1
2
3
4
5
6
SET dt='2019-01-15';

SELECT DATE_SUB(TRUNC(${hiveconf:dt}, 'MM'), 1);

--------------------------------------------------
2018-12-31

本月末

1
2
3
4
5
6
SET dt='2019-01-15';

SELECT LAST_DAY(${hiveconf:dt});

--------------------------------------------------
2019-01-31

下月末

1
2
3
4
5
6
SET dt='2019-01-15';

SELECT DATE_SUB(ADD_MONTHS(TRUNC(${hiveconf:dt}, 'MM'), 2), 1);

--------------------------------------------------
2019-02-28
本文由作者按照 CC BY 4.0 进行授权