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 的形式,这里进行了简写;

二、获取当前时间戳函数
序号语法类型/方法名称输出类型使用说明
1current_timestamp()timestamp返回客户端所在时区的当前时间戳
2now()timestamp返回客户端所在时区的当前时间戳
3unix_timestamp()bigint返回客户端所在时区的当前时间戳的整数形式
4utc_timestamp()timestamp返回客户端时间对应UTC时区的当前时间戳
5timeofday()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
三、时间计算函数
序号语法类型/方法名称输出类型使用说明
1years_add(timestamp/date date, int/bigint years)timestamp/date增加指定年数
2years_sub(timestamp/date date, int/bigint years)timestamp/date减少指定年数
3months_add(timestamp/date date, int/bigint months)timestamp/date增加指定月数
4months_sub(timestamp/date date, int/bigint months)timestamp/date减少指定月数
5add_months(timestamp/date date, int/bigint months)timestamp/date增加指定月数
6weeks_add(timestamp/date date, int/bigint weeks)timestamp/date增加指定周数
7weeks_sub(timestamp/date date, int/bigint weeks)timestamp/date减少指定周数
8days_add(timestamp/date startdate, int/bigint days)timestamp/date增加指定天数
9days_sub(timestamp/date startdate, int/bigint days)timestamp/date减少指定天数
10date_add(timestamp/date startdate, int/bigint days)timestamp/date增加指定天数
11date_sub(timestamp/date startdate, int/bigint days)timestamp/date减少指定天数
12adddate(timestamp/date startdate, int/int days)timestamp/date增加指定天数
13subdate(timestamp/date startdate,bigint/int days)timestamp/date减少指定天数
14hours_add(timestamp date, int/bigint hours)timestamp增加指定小时
15hours_sub(timestamp date, int/bigint hours)timestamp减少指定小时
16minutes_add(timestamp date, int/bigint minutes)timestamp增加指定分钟
17minutes_sub(timestamp date, int/bigint minutes)timestamp减少指定分钟
18seconds_add(timestamp date, int/bigint seconds)timestamp增加指定秒数
19seconds_sub(timestamp date, int/bigint seconds)timestamp减少指定秒数
20milliseconds_add(timestamp t, int/bigint s)timestamp增加指定毫秒数
21milliseconds_sub(timestamp t, int/bigint s)timestamp减少指定毫秒数
22microseconds_add(timestamp t, int/bigint s)timestamp增加指定微秒数
23microseconds_sub(timestamp t, int/bigint s)timestamp减少指定微秒数
24nanoseconds_add(timestamp t, int/bigint s)timestamp增加指定纳秒数
25nanoseconds_sub(timestamp t, int/bigint s)timestamp减少指定纳秒数
26date_add(timestamp/date startdate, interval_expression)timestamp/date使用参数计算日期增量值(增加)
27date_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
四、获取时间指定单位函数
序号语法类型/方法名称输出类型使用说明
1year(timestamp/date date)int获取年
2quarter(timestamp/date date)int获取季节(1,2,3,4)
3month(timestamp/date date)int获取月
4monthname(timestamp/date date)string获取月份名称
5week(timestamp/date date)int获取周(1-53)
6weekofyear(timestamp/date date)int获取周(1-53)
7dayofweek(timestamp/date date)int获取天(本周第多少天,周日算第一天)
8dayname(timestamp/datedate)string获取天(星期几)
9next_day(timestamp/date date,String weekday)timestamp/date获取天(返回下一个指定星期几的日期)
10day(timestamp/date date)int获取天(本月第多少天)
11dayofmonth(timestamp/date date)int获取天(本月第多少天)
12last_day(timestamp/date date)timestamp/date获取天(本月的最后一天日期)
13dayofyear(timestamp/date date)int获取天(本年第多少天)
14hour(timestamp date)int获取小时
15minute(timestamp date)int获取分钟
16second(timestamp date)int获取秒
17millisecond (timestamp date)int获取毫秒
18extract(timestamp/date date,String unit)bigint获取参数指定的时间单位
19extract(unit from timestamp/date date)bigint获取参数指定的时间单位
20date_part(string unit,timestamp timestamp)bigint获取参数指定的时间单位
21trunc(timestamp/date date,String unit)timestamp/date获取截断为指定单位的时间
22date_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
五、时间比较函数
序号语法类型/方法名称输出类型使用说明
1datediff(timestamp/date enddate, timestamp/date startdate)int返回endDate比startDate多多少天
2int_months_between(timestamp/date t1, timestamp/date t2)int返回两个日期相差的整数月份个数
3months_between(timestamp/date t1, timestamp/date t2)double返回浮点数的月数相差的数
4date_cmp(DATE date1, DATE date2)int比较是否相等,返回-1,0,1,null四种数值
5timestamp_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

六、时间格式转换函数
序号语法类型/方法名称输出类型使用说明
1to_date(timestamp date)string返回时间戳对应的date
2to_timestamp(bigint unixtime)timestamp返回整数对应的timestamp值
3to_timestamp(string date,string pattern)timestamp返回字符串对应的timestamp值
4to_utc_timestamp(timestamp t,string timezone)timestamp指定时区的时间戳转化为UTC时区的时间戳
5from_timestamp(timestamp t,string pattern)string把timestamp按照pattern进行格式化
6from_timestamp(string date,string pattern)string把date按照pattern进行格式化
7from_unixtime(bigint unixtime)string把时间戳秒数转化为本地地区中的字符串
8from_unixtime(bigint unixtime,string pattern)string时间戳转化为本地时区字符串,pattern格式
9from_utc_timestamp(timestamp t,string timezone)timestampUTC时区指定时间戳转化为指定时区时间戳
10unix_timestamp(string datetime)bigint把string类型的date或日期转化成时间戳Unix
11unix_timestamp(timestamp datetime)bigint把string类型的timestamp转化成时间戳Unix
12unix_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:2712
               'yyyy-MM-dd HH:mm:ss-hh:mm'
              ) 
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐