Hive零基础从入门到实战 进阶篇(六) HiveQL:日期函数

目录

 

前言

1. 日期函数表

2. 函数功能演示

2.1 时间戳函数 unix_timestamp

2.2 秒时间戳转换为可读时间字符串 from_unixtime

2.3 返回秒值时间戳的日期 to_date

2.4 时间戳字符串的年、月、日、时、分、秒

2.5 日期在当年的第几周 weekofyear

2.6 开始时间到结束时间相差的天数 datediff

2.7 日期加减天数 date_add&date_sub

2.8 返回当前日期(年月日) current_date

2.9 日期加减月份 add_months

2.10 当月最后一天的日期 last_day

2.11 参数对应的下一个星期X的日期 next_day

2.12 当年\月的第一天日期 trunc

2.13 两日期之间相差的月份 months_between

2.14 按指定格式返回时间 date_format


 

前言

本篇博客介绍Hive中的各种日期函数用法,目前来看本文是全网最详细的Hive日期函数介绍~

 

1. 日期函数表

返回数值类型 函数名\所需参数\参数数据类型 描述

bigint

unix_timestamp()

获取该机器的当前时间戳

bigint

unix_timestamp(string date)

将格式为yyyy-MM-dd HH:mm:ss的时间字符串转换成时间戳

bigint

unix_timestamp(string date, string pattern) 将时间字符串按指定格式转换成Unix时间戳 
string from_unixtime(bigint unixtime[, string format]) 将时间戳的秒值转换成format格式

string       

to_date(string timestamp) 返回时间字符串的日期部分。
int year(string date) 返回时间字符串的年
int month(string date) 返回时间字符串的月
int day(string date) 返回时间字符串的日
int hour(string date) 返回时间字符串的时
int minute(string date) 返回时间字符串的分
int second(string date) 返回时间字符串的秒

int

weekofyear(string date) 返回时间字符串位于一年中的第几个周内 如weekofyear("2019-07-12 00:00:00") = 28, weekofyear("2019-07-12") = 28
int datediff(string enddate, string startdate) 返回开始时间startdate到结束时间enddate相差的天数
string date_add(string startdate, int days) 返回从开始时间startdate加上days后的日期

string

date_sub(string startdate, int days) 返回从开始时间startdate减去days后的日期
date current_date 返回当前时间日期,比如:2019-07-12(as of Hive 1.2.0)

string

add_months(string startdate, int num_months) 返回startdate再增加num_months个月的日期

string 

last_day(string date) 返回这个月的最后一天的日期(as of Hive 1.1.0)
string next_day(string startdate, string day_of_week) 返回当前时间的下一个星期X所对应的日期(as of Hive1.2.0)

string

trunc(string date, string format) 返回date的当年或当月的第一天的日期 (as of Hive 1.2.0)
double months_between(date1, date2) 返回date1与date2之间相差的月份,如date1>date2,则返回正,如果date1

string

date_format(timestamp/string ts, string fmt) 按指定格式返回时间date 如:date_format("2019-07-12","MM-dd")=07-12 (as of Hive 1.2.0)

 

2. 函数功能演示

2.1 时间戳函数 unix_timestamp

unix_timestamp()

功能:返回该机器的当前时间戳。

举例:

hive (app)> select unix_timestamp();
1561224376

 

unix_timestamp(string date)

功能:将格式为yyyy-MM-dd HH:mm:ss的时间字符串转换成时间戳。

举例:

hive (app)> select unix_timestamp('2019-07-12 22:00:00');
1562940000

不符合yyyy-MM-dd HH:mm:ss的格式会返回NULL
hive (app)> select unix_timestamp('2019-07-12');
NULL

 

unix_timestamp(string date, string pattern)

功能:将时间字符串按指定格式转换成Unix时间戳。

pattern的格式可为“yyyy-MM-dd hh:mm:ss”,“yyyy-MM-dd hh:mm”,“yyyy-MM-dd hh”,“yyyy-MM-dd”,“yyyy-MM”,“yyyy”等 。

举例:

输入年,返回2019-01-01 00:00:00的秒时间戳
hive (app)> select unix_timestamp('2019','yyyy');
1546272000

输入年月,返回2019-07-01 00:00:00的秒时间戳,注意月必须用大写的MM,否则7会分配到分钟上。
hive (app)> select unix_timestamp('2019-07','yyyy-MM');
1561910400


输入年月日,返回2019-07-12 00:00:00的秒时间戳
hive (app)> select unix_timestamp('2019-07-12','yyyy-MM-dd');
1562860800

输入年月日 时,返回2019-07-12 22:00:00的秒时间戳
hive (app)> select unix_timestamp('2019-07-12 22','yyyy-MM-dd hh');
1562940000

输入年月日 时分,返回2019-07-12 22:30:00的秒时间戳
hive (app)> select unix_timestamp('2019-07-12 22:30','yyyy-MM-dd hh:mm');
1562941800

输入年月日 时分秒,返回2019-07-12 22:30:30的秒时间戳
hive (app)> select unix_timestamp('2019-07-12 22:30:30','yyyy-MM-dd hh:mm:ss');
1562941830

如果输入的date内容比后边设定的格式少,返回NULL
hive (app)> select unix_timestamp('2019-07-12','yyyy-MM-dd hh:mm:ss');
NULL

如果输入的date内容比后边设定的格式多,返回设定的格式的时间戳,这里返回的是2019-07-12 00:00:00
hive (app)> select unix_timestamp('2019-07-12 22:30:30','yyyy-MM-dd');
1562860800

 

2.2 秒时间戳转换为可读时间字符串 from_unixtime

from_unixtime(bigint unixtime[, string format])

功能:unixtime传入秒值的时间戳。

format可指定的日期展示格式,可由yyyy、MM、dd、hh、mm、ss 6个元素使用任何字符进行任意连接组合。format如果不填则默认返回yyyy-MM-dd hh:mm:ss格式的时间字符串。

举例:

format如果不填则默认返回yyyy-MM-dd hh:mm:ss格式的时间字符串:
hive (app)> select from_unixtime(1546272000);
2019-01-01 00:00:00

hive (app)> select from_unixtime(1546272000,'yyyy');
2019

hive (app)> select from_unixtime(1546272000,'yyyy-MM');
2019-01

hive (app)> select from_unixtime(1546272000,'yyyyMMdd');
20190101

hive (app)> select from_unixtime(1546272000,'yyyy/MM/dd hh');
2019/01/01 12

hive (app)> select from_unixtime(1546272000,'yyyy-MM-dd hh:mm');
2019-01-01 12:00

hive (app)> select from_unixtime(1546272000,'yyyy-MM-dd hh:mm:ss');
2019-01-01 12:00:00

 

2.3 返回秒值时间戳的日期 to_date

to_date(string timestamp)

功能:timestamp传入秒值的时间戳,返回yyyy-MM-dd格式的日期时间字符串。

举例:

hive (app)> select to_date("1970-01-01 00:00:00");
1970-01-01

2.4 时间戳字符串的年、月、日、时、分、秒

year(string date)    
month(string date)    
day(string date) 
hour(string date)    
minute(string date)    
second(string date)  
 

功能:分别返回时间戳字符串的年、月、日、时、分、秒。

date的格式可以是“yyyy-MM-dd hh:mm:ss”,“yyyy-MM-dd hh:mm”,“yyyy-MM-dd hh”,“yyyy-MM-dd”,“yyyy-MM”,“yyyy”等。 

举例:

返回时间戳字符串的年
hive (app)> select year('2019-09-09 12:12:12');
2019

返回时间戳字符串的年
hive (app)> select year('2019-09-09');
2019

返回时间戳字符串的月
hive (app)> select month('2019-09-09 12:12:12');
9

返回时间戳字符串的日
hive (app)> select day('2019-09-09 12:12:12');
9

返回时间戳字符串的时
hive (app)> select hour('2019-09-09 12:12:12');
12

返回时间戳字符串的分
hive (app)> select minute('2019-09-09 12:12:12');
12

返回时间戳字符串的秒
hive (app)> select second('2019-09-09 12:12:12');
12

 

2.5 日期在当年的第几周 weekofyear

weekofyear(string date)

功能:返回时间字符串位于一年中的第几个周内。

date的格式可以是“yyyy-MM-dd hh:mm:ss”,“yyyy-MM-dd hh:mm”,“yyyy-MM-dd hh”,“yyyy-MM-dd”,至少要包含年月日,否则会返回NULL。

举例:

hive (app)> select weekofyear('2019-07-12 00:00:00');
28

hive (app)> select weekofyear('2019-07-12');
28

hive (app)> select weekofyear('2019-07');
NULL

 

2.6 开始时间到结束时间相差的天数 datediff

datediff(string enddate, string startdate)

功能:返回开始时间startdate到结束时间enddate相差的天数。

第一个参数为结束时间enddate,第二个参数为开始时间startdate,二者的格式可以是“yyyy-MM-dd hh:mm:ss”,“yyyy-MM-dd hh:mm”,“yyyy-MM-dd hh”,“yyyy-MM-dd”,至少要包含年月日,否则会返回NULL。

举例:

hive (app)> select datediff('2019-07-12','2019-07-01');
11

hive (app)> select datediff('2019-07-12 12:00:00','2019-07-01');
11

hive (app)> select datediff('2019-07-12 12:00:00','2019-07-01 9:00:00');
11

hive (app)> select datediff('2019-07','2019-07-01');
NULL

 

2.7 日期加减天数 date_add&date_sub

date_add(string startdate, int days)

date_sub(string startdate, int days)

功能:返回开始时间startdate加上或减去days后的日期时间(只包含年月日)。

第一个参数startdate为开始时间,格式可以是“yyyy-MM-dd hh:mm:ss”,“yyyy-MM-dd hh:mm”,“yyyy-MM-dd hh”,“yyyy-MM-dd”,至少要包含年月日,否则会返回NULL。

第二个参数days是加减的天数。

举例:

hive (app)> select date_add('2019-07-12',2);
2019-07-14

hive (app)> select date_sub('2019-07-12',2);
2019-07-10

hive (app)> select date_sub('2019-07-12 12:00:00',2);
2019-07-10

hive (app)> select date_sub('2019-07',2);
NULL

 

2.8 返回当前日期(年月日) current_date

current_date

功能:返回当前时间日期,格式为“yyyy-MM-dd”,只包含年月日。(Hive 1.2.0后才有)

举例:

hive (app)> select current_date;
2019-06-24

 

2.9 日期加减月份 add_months

add_months(string startdate, int num_months)

功能:返回startdate再增加num_months个月的日期,返回值的格式为“yyyy-MM-dd”,只包含年月日。

第一个参数startdate为开始时间,格式可以是“yyyy-MM-dd hh:mm:ss”,“yyyy-MM-dd hh:mm”,“yyyy-MM-dd hh”,“yyyy-MM-dd”,至少要包含年月日,否则会返回NULL。

第二个参数num_months为加减的月份数。当其为正整数时,增加相应月份;为负整数时,则减少相应月份。

举例:

hive (app)> select add_months('2019-07-12 12:00:00',2);
2019-09-12

hive (app)> select add_months('2019-07-12',2);
2019-09-12

hive (app)> select add_months('2019-07-12',-2);
2019-05-12 

hive (app)> select add_months('2019-07',2);
NULL

 

2.10 当月最后一天的日期 last_day

last_day(string date)

功能:返回这个月的最后一天的日期(Hive 1.1.0后才有),返回值的格式为“yyyy-MM-dd”,只包含年月日。

参数date为时间字符串,格式可以是“yyyy-MM-dd hh:mm:ss”,“yyyy-MM-dd hh:mm”,“yyyy-MM-dd hh”,“yyyy-MM-dd”,至少要包含年月日,否则会返回NULL。

举例:

hive (app)> select last_day('2019-07-12');
2019-07-31

hive (app)> select last_day('2019-07-12 12:00:00');
2019-07-31

hive (app)> select last_day('2019-07');
NULL

 

2.11 参数对应的下一个星期X的日期 next_day

next_day(string startdate, string day_of_week)

功能:返回startdate的下一个星期X所对应的日期(Hive 1.2.0后才有),返回值的格式为“yyyy-MM-dd”,只包含年月日。

第一个参数startdate为时间字符串,格式可以是“yyyy-MM-dd hh:mm:ss”,“yyyy-MM-dd hh:mm”,“yyyy-MM-dd hh”,“yyyy-MM-dd”,至少要包含年月日,否则会返回NULL。

第二个参数day_of_week格式可以有三种:

  1. 星期几的英文全拼(不区分大小写):MONDAY、TUESDAY、Wednesday、Thursday、Friday、Saturday、sunday
  2. 星期几的英文前三个字母(不区分大小写):MON、TUE、Wed、Thu、Fri、Sat、sun
  3. 星期几的英文前两个字母(不区分大小写):MO、TU、We、Th、Fr、Sa、su

举例:

返回2019-07-12的下一个周一的日期
hive (app)> select next_day('2019-07-12 12:00:00','monday');
2019-07-15

hive (app)> select next_day('2019-07-12 12:00:00','mon');
2019-07-15

hive (app)> select next_day('2019-07-12 12:00:00','mo');
2019-07-15

 

2.12 当年\月的第一天日期 trunc

trunc(string date, string format)

功能:返回date的当年或当月的第一天的日期(Hive 1.2.0后才有),返回值的格式为“yyyy-MM-dd”,只包含年月日。

第一个参数date为时间字符串,格式可以是“yyyy-MM-dd hh:mm:ss”,“yyyy-MM-dd hh:mm”,“yyyy-MM-dd hh”,“yyyy-MM-dd”,至少要包含年月日,否则会返回NULL。

第二个参数format所支持的格式:月份为MONTH/MON/MM, 年份为YEAR/YYYY/YY。

举例:

MM则返回当月的第一天日期
hive (app)> select trunc('2019-07-12 12:00:00','MM');
2019-07-01

hive (app)> select trunc('2019-07-12','MM');
2019-07-01

YY则返回当年的第一天日期
hive (app)> select trunc('2019-07-12 12:00:00','YY');
2019-01-01

hive (app)> select trunc('2019-07-12','YY');
2019-01-01

 

2.13 两日期之间相差的月份 months_between

months_between(date1, date2)

功能:返回date1与date2之间相差的月份,如date1>date2,则返回正,如果date1

date1、date2为时间字符串,格式可以是“yyyy-MM-dd hh:mm:ss”,“yyyy-MM-dd hh:mm”,“yyyy-MM-dd hh”,“yyyy-MM-dd”,至少要包含年月日,否则会返回NULL。

举例:

2019-07-12 12:00:00和2019-07-11 01:00:00之间相隔0.04704301个月
hive (app)> select months_between('2019-07-12 12:00:00','2019-07-11 01:00:00');
0.04704301

hive (app)> select months_between('2019-07-12 12:00:00','2019-07-12 12:00:00');
0.0

hive (app)> select months_between('2019-07-12 12:00:00','2019-06-12 12:00:00');
1.0

hive (app)> select months_between('2019-07-12','2019-07-11');
0.03225806

hive (app)> select months_between('2019-08','2019-07');
NULL

 

2.14 按指定格式返回时间 date_format

date_format(timestamp/string ts, string fmt)

功能:按指定格式返回时间date (Hive 1.2.0后才有),返回值是指定格式的时间字符串。

第一个参数ts为时间字符串,格式可以是“yyyy-MM-dd hh:mm:ss”,“yyyy-MM-dd hh:mm”,“yyyy-MM-dd hh”,“yyyy-MM-dd”,至少要包含年月日,否则会返回NULL。

第二个参数fmt为可指定的日期展示格式,可由yyyy、MM、dd、hh、mm、ss 6个元素使用任何字符进行任意连接组合。

举例:

hive (app)> select date_format('2019-07-12 12:00:00','yyyy/MM');
2019/07


hive (app)> select date_format('2019-07-12 12:00:00','yyyyMMdd');
20190712

hive (app)> select date_format('2019-07-12','yyyyMMdd');
20190712

 


能看到这里的同学,就右上角点个赞吧,3Q~

你可能感兴趣的:(Hive零基础从入门到实战 进阶篇(六) HiveQL:日期函数)