impala时间函数最全版(强烈建议收藏)
本文基于impala3.2版本,所有的内置时间函数;
一、补充概念说明
1、date类型和timestamp类型区别
对于一个完整的时间格式来说:2021-02-02 09:59:42.46,前半部分属于date,后半部分属于time;date类型的字段只支持前半部分
timestamp可用来表示完整格式的时间,时间存储:插入时间(当前时区)->UTC(世界标准时间)->输出时间(客户端当前时区)
2、时区
地球上不同的区域使用同一时间标准的定义;常见的世界标准时间(UTC),北京时间(UTC+8);
时区的表示,比如:Asia/Shanghai,America/New_York
3、本文中的使用示例都是 select (使用示例) from table 的形式,这里进行了简写;
二、获取当前时间戳函数
序号 | 语法类型/方法名称 | 输出类型 | 使用说明 |
---|---|---|---|
1 | current_timestamp() | timestamp | 返回客户端所在时区的当前时间戳 |
2 | now() | timestamp | 返回客户端所在时区的当前时间戳 |
3 | unix_timestamp() | bigint | 返回客户端所在时区的当前时间戳的整数形式 |
4 | utc_timestamp() | timestamp | 返回客户端时间对应UTC时区的当前时间戳 |
5 | timeofday() | string | 根据本地系统的时间(包括任何时区指定)返回当前日期 和时间的字符串表示形式。 |
示例如下:执行时间北京时间:2021-02-04 08:46:27
--使用示例 | 对应输出 | 对应函数序号
current_timestamp() 2021-02-04 08:46:27 1
now() 2021-02-04 08:46:27 2
unix_timestamp() 1612399587 3
timeofday() Thu Feb 04 08:46:27 2021 CST 4
utc_timestamp() 2021-02-04 00:46:27 5
三、时间计算函数
序号 | 语法类型/方法名称 | 输出类型 | 使用说明 |
---|---|---|---|
1 | years_add(timestamp/date date, int/bigint years) | timestamp/date | 增加指定年数 |
2 | years_sub(timestamp/date date, int/bigint years) | timestamp/date | 减少指定年数 |
3 | months_add(timestamp/date date, int/bigint months) | timestamp/date | 增加指定月数 |
4 | months_sub(timestamp/date date, int/bigint months) | timestamp/date | 减少指定月数 |
5 | add_months(timestamp/date date, int/bigint months) | timestamp/date | 增加指定月数 |
6 | weeks_add(timestamp/date date, int/bigint weeks) | timestamp/date | 增加指定周数 |
7 | weeks_sub(timestamp/date date, int/bigint weeks) | timestamp/date | 减少指定周数 |
8 | days_add(timestamp/date startdate, int/bigint days) | timestamp/date | 增加指定天数 |
9 | days_sub(timestamp/date startdate, int/bigint days) | timestamp/date | 减少指定天数 |
10 | date_add(timestamp/date startdate, int/bigint days) | timestamp/date | 增加指定天数 |
11 | date_sub(timestamp/date startdate, int/bigint days) | timestamp/date | 减少指定天数 |
12 | adddate(timestamp/date startdate, int/int days) | timestamp/date | 增加指定天数 |
13 | subdate(timestamp/date startdate,bigint/int days) | timestamp/date | 减少指定天数 |
14 | hours_add(timestamp date, int/bigint hours) | timestamp | 增加指定小时 |
15 | hours_sub(timestamp date, int/bigint hours) | timestamp | 减少指定小时 |
16 | minutes_add(timestamp date, int/bigint minutes) | timestamp | 增加指定分钟 |
17 | minutes_sub(timestamp date, int/bigint minutes) | timestamp | 减少指定分钟 |
18 | seconds_add(timestamp date, int/bigint seconds) | timestamp | 增加指定秒数 |
19 | seconds_sub(timestamp date, int/bigint seconds) | timestamp | 减少指定秒数 |
20 | milliseconds_add(timestamp t, int/bigint s) | timestamp | 增加指定毫秒数 |
21 | milliseconds_sub(timestamp t, int/bigint s) | timestamp | 减少指定毫秒数 |
22 | microseconds_add(timestamp t, int/bigint s) | timestamp | 增加指定微秒数 |
23 | microseconds_sub(timestamp t, int/bigint s) | timestamp | 减少指定微秒数 |
24 | nanoseconds_add(timestamp t, int/bigint s) | timestamp | 增加指定纳秒数 |
25 | nanoseconds_sub(timestamp t, int/bigint s) | timestamp | 减少指定纳秒数 |
26 | date_add(timestamp/date startdate, interval_expression) | timestamp/date | 使用参数计算日期增量值(增加) |
27 | date_sub(timestamp/date startdate, interval_expression) | timestamp/date | 使用参数计算日期增量值(减少) |
补充说明:
①为了方便表达,下面参数都是用timestamp,执行时间北京时间:2021-02-04 08:46:27.707274000;
②年月周日这些函数都是可以用timestamp和date类型,输入是什么类型输出就是什么类型;(比如输入date,输出也是date)
③1秒=1000毫秒=1000000微妙=1000000000纳秒(分别是3,6,9次方)
④interval_expression的表述可用如下:YEAR[S],MONTH[S] ,WEEK[S] ,DAY[S], HOUR[S], MINUTE[S] ,SECOND[S] ,MILLISECOND[S] ,MICROSECOND[S], NANOSECOND[S] 【表述不区分大小写】
示例如下:
--使用示例 | 对应输出 | 对应函数序号
years_add(now(),1) 2022-02-04 08:46:27 1
years_sub(now(),1) 2020-02-04 08:46:27 2
months_add(now(),1) 2021-03-04 08:46:27 3
months_sub(now(),1) 2021-01-04 08:46:27 4
add_months(now(),1) 2021-03-04 08:46:27 5
weeks_add(now(), 1) 2021-02-11 08:46:27 6
weeks_sub(now(), 1) 2021-01-28 08:46:27 7
days_add(now(),1) 2021-02-05 08:46:27 8
days_sub(now(), 1) 2021-02-03 08:46:27 9
date_add(now(), 1) 2021-02-05 08:46:27 10
date_sub(now(), 1) 2021-02-03 08:46:27 11
adddate(now(),1) 2021-02-05 08:46:27 12
subdate(now(),1) 2021-02-03 08:46:27 13
hours_add(now(),1) 2021-02-03 09:46:27 14
hours_sub(now(),1) 2021-02-03 07:46:27 15
minutes_add(now(),1) 2021-02-03 08:47:27 16
minutes_sub(now(),1) 2021-02-03 08:45:27 17
seconds_add(now(),1) 2021-02-04 08:46:28 18
seconds_sub(now(),1) 2021-02-04 08:46:26 19
milliseconds_add(now(),1000) 2021-02-04 08:46:28.707274000 20
milliseconds_sub(now(),1000) 2021-02-04 08:46:26.707274000 21
microseconds_add(now(),1000) 2021-02-04 08:46:27.708274000 22
microseconds_sub(now(),1000) 2021-02-04 08:46:27.706274000 23
nanoseconds_add(now(),1000) 2021-02-04 08:46:27.707275000 24
nanoseconds_sub(now(),1000) 2021-02-04 08:46:27.707273000 25
date_add(now(),interval 2 months) 2021-04-04 08:46:27 26
date_sub(now(),interval 2 hours) 2021-02-04 06:46:27 27
四、获取时间指定单位函数
序号 | 语法类型/方法名称 | 输出类型 | 使用说明 |
---|---|---|---|
1 | year(timestamp/date date) | int | 获取年 |
2 | quarter(timestamp/date date) | int | 获取季节(1,2,3,4) |
3 | month(timestamp/date date) | int | 获取月 |
4 | monthname(timestamp/date date) | string | 获取月份名称 |
5 | week(timestamp/date date) | int | 获取周(1-53) |
6 | weekofyear(timestamp/date date) | int | 获取周(1-53) |
7 | dayofweek(timestamp/date date) | int | 获取天(本周第多少天,周日算第一天) |
8 | dayname(timestamp/datedate) | string | 获取天(星期几) |
9 | next_day(timestamp/date date,String weekday) | timestamp/date | 获取天(返回下一个指定星期几的日期) |
10 | day(timestamp/date date) | int | 获取天(本月第多少天) |
11 | dayofmonth(timestamp/date date) | int | 获取天(本月第多少天) |
12 | last_day(timestamp/date date) | timestamp/date | 获取天(本月的最后一天日期) |
13 | dayofyear(timestamp/date date) | int | 获取天(本年第多少天) |
14 | hour(timestamp date) | int | 获取小时 |
15 | minute(timestamp date) | int | 获取分钟 |
16 | second(timestamp date) | int | 获取秒 |
17 | millisecond (timestamp date) | int | 获取毫秒 |
18 | extract(timestamp/date date,String unit) | bigint | 获取参数指定的时间单位 |
19 | extract(unit from timestamp/date date) | bigint | 获取参数指定的时间单位 |
20 | date_part(string unit,timestamp timestamp) | bigint | 获取参数指定的时间单位 |
21 | trunc(timestamp/date date,String unit) | timestamp/date | 获取截断为指定单位的时间 |
22 | date_trunc(string unit,timestamp/date date) | timestamp/date | 获取截断为指定单位的时间 |
补充说明:
①extract 的时间单位可以使用如下:YEAR,QUARTER,MONTH,DAY,HOUR,MINUTE,SECOND,MILLISECOND,EPOCH(转成数字类型)【单位不区分大小写】
②date_part和extract支持的时间单位一致;对于小时,分秒这些都是不知道date类型操作的(因为date只到天)
③date_trunc的时间单位可以使用如下:MILLENNIUM(千年),CENTURY(百年),DECADE(十年),YEAR,MONTH,WEEK,DAY,HOUR, MINUTE,SECOND,MILLISECONDS(毫秒),MICROSECONDS(微妙)【单位不区分大小写】
④trunc的时间单位可以使用如下:
unit | 截取说明 |
---|---|
SYYYY,YYYY,YEAR,SYEAR,YYY,YY,Y | 年 |
Q | 季节 |
MONTH,MON,MM,RM | 月 |
WW | 最近的日期是与一年中的第一天相同的日期 |
W | 最近的日期是与该月的第一天相同的星期几 |
DDD,DD,J | 天 |
DAY,DY,D | 星期几(星期一)的开始 |
HH,HH12,HH24 | 小时 |
MI | 分钟 |
示例如下:执行时间北京时间:2021-02-04 08:46:27.707274000;(星期四)
--使用示例 | 对应输出 | 对应函数序号
year(now()) 2021 1
quarter(now()) 1 2
month(now()) 2 3
monthname(now()) February 4
week(now()) 5 5
weekofyear(now()) 5 6
dayofweek(now()) 5 7
dayname(now()) Thursday 8
next_day(now(),'monday') 2021-02-08 08:46:27 9
day(now()) 4 10
dayofmonth(now()) 4 11
last_day(now()) 2021-02-28 00:00:00 12
dayofyear(now()) 35 13
hour(now()) 8 14
minute(now()) 46 15
second(now()) 27 16
millisecond (now()) 707 17
extract(now(),'year') 2021 18
extract(year from now()) 2021 19
trunc(now(),'year') 2021-01-01 00:00:00 20
date_trunc('year',now()) 2021-01-01 00:00:00 21
五、时间比较函数
序号 | 语法类型/方法名称 | 输出类型 | 使用说明 |
---|---|---|---|
1 | datediff(timestamp/date enddate, timestamp/date startdate) | int | 返回endDate比startDate多多少天 |
2 | int_months_between(timestamp/date t1, timestamp/date t2) | int | 返回两个日期相差的整数月份个数 |
3 | months_between(timestamp/date t1, timestamp/date t2) | double | 返回浮点数的月数相差的数 |
4 | date_cmp(DATE date1, DATE date2) | int | 比较是否相等,返回-1,0,1,null四种数值 |
5 | timestamp_cmp(timestamp t1,timestamp t2) | int | 比较是否相等,返回-1,0,1,null四种数值 |
补充说明:
①计算天数和月份相差的值,都是省略掉time的部分,只比较date的部分;(比如23:59:00和 00:02:00也是差一天)
示例如下:执行时间北京时间:2021-02-04 08:46:27.707274000;(星期四)
--使用示例 | 对应输出 | 对应函数序号
datediff('2020-07-31', '2020-07-30') 1 1
int_months_between('2020-03-31', '2020-01-20') 2 2
months_between('2020-02-28','2020-03-01') -0.12903225806451613 3
date_cmp('2021-01-01','2020-12-01') 1 4
timestamp_cmp('2021-01-01','2020-12-01') 1 5
六、时间格式转换函数
序号 | 语法类型/方法名称 | 输出类型 | 使用说明 |
---|---|---|---|
1 | to_date(timestamp date) | string | 返回时间戳对应的date |
2 | to_timestamp(bigint unixtime) | timestamp | 返回整数对应的timestamp值 |
3 | to_timestamp(string date,string pattern) | timestamp | 返回字符串对应的timestamp值 |
4 | to_utc_timestamp(timestamp t,string timezone) | timestamp | 指定时区的时间戳转化为UTC时区的时间戳 |
5 | from_timestamp(timestamp t,string pattern) | string | 把timestamp按照pattern进行格式化 |
6 | from_timestamp(string date,string pattern) | string | 把date按照pattern进行格式化 |
7 | from_unixtime(bigint unixtime) | string | 把时间戳秒数转化为本地地区中的字符串 |
8 | from_unixtime(bigint unixtime,string pattern) | string | 时间戳转化为本地时区字符串,pattern格式 |
9 | from_utc_timestamp(timestamp t,string timezone) | timestamp | UTC时区指定时间戳转化为指定时区时间戳 |
10 | unix_timestamp(string datetime) | bigint | 把string类型的date或日期转化成时间戳Unix |
11 | unix_timestamp(timestamp datetime) | bigint | 把string类型的timestamp转化成时间戳Unix |
12 | unix_timestamp(string datetime,string pattern) | bigint | 日期按pattern转化成时间戳Unix |
**补充说明:**①模式字符串使用说明:
模式 | 描述 |
---|---|
y | 年 |
M | 月 |
d | 日 |
H | 小时 |
m | 分钟 |
s | 秒 |
S | 小数秒 |
+/-hh:mm | 时区偏移 |
+/-hhmm | 时区偏移 |
+/-hh | 时区偏移 |
示例如下:执行时间北京时间:2021-02-04 08:46:27.707274000;(星期四)
--使用示例 | 对应输出 | 对应函数序号
to_date(now()) 2021-02-04 1
to_timestamp(1612399587) 2021-02-04 08:46:27 2
to_timestamp('2021/02/04','yyyy/MM/dd') 2021-02-04 00:00:00 3
to_utc_timestamp(now(),'Asia/Shanghai') 2021-02-04 00:46:27 4
from_timestamp(now(),'yyyy/MM') 2021/02 5
from_timestamp('2021-02-04','yyyy/MM') 2021/02 6
from_unixtime(1612399587) 2021-02-04 08:46:27 7
from_unixtime(1612399587,'yyyy/MM') 2021/02 8
from_utc_timestamp(now(),'Asia/Shanghai') 2021-02-04 16:46:27 9
unix_timestamp('2021-02-04') 1612368000 10
unix_timestamp(now()) 1612399587 11
unix_timestamp('2021-02-04 08:46:27-01:00', 1612403187 (相当于2021-02-04 09:46:27) 12
'yyyy-MM-dd HH:mm:ss-hh:mm'
)