持续更新中
Impala和Hive相比,查询速度更快,目前很多公司都会用Impala查询数据仓库的数据。
一、时间类型
1、date类型与timestamp类型
一个完整的时间:2022-06-02 10:42:31.46
其中前半部分(2022-06-02)属于date,后半部分(10:42:31.46)属于time;
date类型的字段只支持前半部分,timestamp可用来表示完整格式的时间
2、时区
地球上不同区域使用同一时间标准的定义;常见的世界标准时间(UTC),北京时间(UTC+8);
时间存储方式:插入时间(当前时区)->UTC
(世界标准时间)->输出时间(客户端当前时区)
时区的表示,比如:Asia/Shanghai,America/New_York
二、获取当前时间与指定时间
1、获取当前时间
序号 | 函数 | 输出类型 | 说明 |
---|---|---|---|
1 | now() | timestamp | 系统当前时间的时间戳 |
2 | current_timestamp() | timestamp | 系统当前时间的时间戳 |
3 | unix_timestamp() | bigint | 系统当前时间的时间戳整数形式 |
4 | timeofday() | string | 系统当前日期和时间的字符串表示形式 |
5 | utc_timestamp() | timestamp | 系统对应UTC时区的当前时间戳 |
select now(),current_timestamp(), unix_timestamp(), timeofday(), utc_timestamp()
函数 | 输出 |
now() 2022-06-13 13:52:11.847700000
current_timestamp() 2022-06-13 13:52:11.847700000
unix_timestamp() 1655128331
timeofday() Mon Jun 13 13:52:11 2022 CST
utc_timestamp() 2022-06-13 05:52:11.847700000
2、获取指定时间
序号 | 函数 | 输出类型 | 说明 | 时间颗粒度 | 备注 |
---|---|---|---|---|---|
1 | year(timestamp/date date) | int | 获取年 | 年 | |
2 | dayofyear(timestamp/date date) | int | 获取本年第多少天 | 年/日 | |
3 | quarter(timestamp/date date) | int | 季度(1,2,3,4) | 季 | |
4 | month(timestamp/date date) | int | 获取月数 | 月 | |
5 | monthname(timestamp/date date) | timestamp/date | 月份名称 | 月 | |
6 | day(timestamp/date date) | int | 获取本月第多少天 | 月/日 | |
7 | dayofmonth(timestamp/date date) | int | 获取本月第多少天 | 月/日 | |
8 | last_day(timestamp/date date) | string | 月末最后一天 | 月/日 | 获取每月最后一天,可用于统计每月月末数据 |
9 | week(timestamp/date date) | int | 获取周(1-53) | 周 | |
10 | weekofyear(timestamp/date date) | int | 获取周(1-53) | 周 | 按照日历周,从周一到周天为1周,可用于统计每周期间数 |
11 | dayofweek(timestamp/date date) | int | 本周第多少天,周日算第一天 | 周/日 | |
12 | dayname(timestamp/datedate) | string | 获取星期几 | 周/日 | |
13 | next_day(timestamp/date date,String weekday) | timestamp/date | 获取天(返回下一周指定星期几的日期) | 周/日 | String weekday 用于指定星期几 |
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 | 获取参数指定的时间单位 | 指定时间单位 | String unit用于指定时间单位 |
19 | extract(unit from timestamp/date date) | bigint | 获取参数指定的时间单位 | 指定时间单位 | String unit用于指定时间单位 |
20 | date_part(string unit,timestamp timestamp) | bigint | 获取参数指定的时间单位 | 指定时间单位 | String unit用于指定时间单位 |
21 | trunc(timestamp/date date,String unit) | timestamp/date | 获取截断为指定单位的时间 | 指定时间单位 | String unit用于指定时间单位,指定‘MM’可以当作月初第1天 |
22 | date_trunc(string unit,timestamp/date date) | timestamp/date | 获取截断为指定单位的时间 | 指定时间单位 | String unit用于指定时间单位 |
补充信息:
1、extract的时间单位可以使用如下:YEAR,QUARTER,MONTH,DAY,HOUR,MINUTE,SECOND,MILLISECOND,EPOCH(转成数字类型)【单位不区分大小写】
2、date_part和extract支持的时间单位一致;对于小时,分秒这些都是不知道date类型操作的(因为date只到天)
3、date_trunc的时间单位可以使用如下:MILLENNIUM(千年),CENTURY(百年),DECADE(十年),YEAR,MONTH,WEEK,DAY,HOUR,MINUTE,SECOND,MILLISECONDS(毫秒),MICROSECONDS(微妙)【单位不区分大小写】
4、trunc的时间单位可以使用如下:
实现功能 | Unit |
---|---|
年 | SYYYY,YYYY,YEAR,SYEAR,YYY,YY,Y |
季度 | Q |
月 | MONTH,MON,MM,RM |
天 | DDD,DD,J |
小时 | HH,HH12,HH24 |
分钟 | MI |
星期几(星期一)的开始 | DAY,DY,D |
以2022-06-13 16:18:03.647544000为例
--使用示例 | 对应输出 | 对应函数序号
year(now()) 2022 1
dayofyear(now()) 164 2
quarter(now()) 2 3
month(now()) 6 4
monthname(now()) June 5
day(now()) 13 6
dayofmonth(now()) 13 7
last_day(now()) 2022-06-30 00:00:00 8
week(now()) 24 9
weekofyear(now()) 24 10
dayofweek(now()) 2 11
dayname(now()) Monday 12
next_day(now(),'monday') 2022-06-20 16:18:03.647544000 13
hour(now()) 16 14
minute(now()) 18 15
second(now()) 3 16
millisecond (now()) 647 17
extract(now(),'month') 6 18
extract(month from now()) 6 19
trunc(now(),'month') 2022-06-01 00:00:00 20
date_trunc('month',now()) 2022-06-01 00:00:00 21
三、时间计算函数
序号 | 函数 | 输出类型 | 说明 | 时间颗粒度 | 备注 |
---|---|---|---|---|---|
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 | 增加指定天数 | 天 | date后面不加s |
11 | date_sub(timestamp/date startdate, int/bigint days) | timestamp/date | 减少指定天数 | 天 | date后面不加s |
12 | adddate(timestamp/date startdate, int/int days) | timestamp/date | 增加指定天数 | 天 | date后面不加s |
13 | subdate(timestamp/date startdate,bigint/int days) | timestamp/date | 减少指定天数 | 天 | date后面不加s |
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 | date_add(timestamp/date startdate, interval_expression) | timestamp/date | 使用参数计算日期增量值(增加) | 特定时间 | date后面不加s |
21 | date_sub(timestamp/date startdate, interval_expression) | timestamp/date | 使用参数计算日期增量值(减少) | 特定时间 | date后面不加s |
补充信息:
1、年月周日函数可以用timestamp和date类型,输出与输入类型相同;(比如输入date,输出也是date)
2、interval_expression的表述包含如下:YEAR[S],MONTH[S] ,WEEK[S] ,DAY[S], HOUR[S], MINUTE[S] ,SECOND[S] ,MILLISECOND[S] ,MICROSECOND[S], NANOSECOND[S] 【表述不区分大小写】
3、示例如下:
--使用示例 | 对应输出 | 对应函数序号
years_add(now(),1) 2023-06-13 16:46:21.044102000 1
years_sub(now(),1) 2021-06-13 16:46:21.044102000 2
months_add(now(),1) 2022-07-13 16:46:21.044102000 3
months_sub(now(),1) 2022-05-13 16:46:21.044102000 4
add_months(now(),1) 2022-07-13 16:46:21.044102000 5
weeks_add(now(), 1) 2022-06-20 16:46:21.044102000 6
weeks_sub(now(), 1) 2022-06-06 16:46:21.044102000 7
days_add(now(),1) 2022-06-14 16:46:21.044102000 8
days_sub(now(), 1) 2022-06-12 16:46:21.044102000 9
date_add(now(), 1) 2022-06-14 16:46:21.044102000 10
date_sub(now(), 1) 2022-06-12 16:46:21.044102000 11
adddate(now(),1) 2022-06-14 16:46:21.044102000 12
subdate(now(),1) 2022-06-12 16:46:21.044102000 13
hours_add(now(),1) 2022-06-13 17:46:21.044102000 14
hours_sub(now(),1) 2022-06-13 15:46:21.044102000 15
minutes_add(now(),1) 2022-06-13 16:47:21.044102000 16
minutes_sub(now(),1) 2022-06-13 16:45:21.044102000 17
seconds_add(now(),1) 2022-06-13 16:46:22.044102000 18
seconds_sub(now(),1) 2022-06-13 16:46:20.044102000 19
date_add(now(),interval 3 months) 2022-09-13 16:46:21.044102000 20
date_sub(now(),interval 3 hours) 2022-06-13 13:46:21.044102000 21
四、时间比较函数
序号 | 实现功能 | 函数 | 输出类型 | 备注 |
---|---|---|---|---|
1 | 返回endDate比startDate多多少天(整数) | datediff(timestamp/date enddate, timestamp/date startdate) | int | 输出相差整数的天数 |
2 | 返回endDate比startDate多多少天(含小数) | (unix_timestamp(timestamp/date enddate)-unix_timestamp(timestamp/date startdate) )/3600/24 | int | 输出相差小数的天数,小数部分即为相差未满24小时的时间 |
4 | 返回两个日期相差的整数月份个数 | int_months_between(timestamp/date t1, timestamp/date t2) | int | 输出相差整数的月数 |
5 | 返回浮点数的月数相差的数 | months_between(timestamp/date t1, timestamp/date t2) | double | 小数部分表示未满1月的时间 |
补充信息
1、计算天数和月份相差的值,都是省略掉time的部分,只比较date的部分;(比如23:59:00和 00:02:00也是差一天)
2、示例如下:
例子 | 输出结果 |
datediff('2022-06-01 12:00:01','2022-05-31 23:25:36') 1
( unix_timestamp('2022-06-01 12:00:01')-unix_timestamp('2022-05-31 23:25:36') )/3600/24 0.523900462962963
int_months_between('2022-06-01','2022-05-31') 0
months_between('2022-06-01','2022-05-31') 0.032258064516129004
五、时间转换函数
序号 | 函数 | 输出类型 | 说明 | 时间颗粒度 | 备注 |
---|---|---|---|---|---|
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进行格式化 | 特定时间 | 在maxcompute中to_char()可以起到同样的效果 |
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 | 时间戳 | impala可用 |
12 | unix_timestamp(string datetime,string pattern) | bigint | 日期按pattern转化成时间戳Unix | 特定时间 |
补充说明:
1、模式字符串使用说明:
模式 | 描述 |
---|---|
y | 年 |
M | 月 |
d | 日 |
H | 小时 |
m | 分钟 |
s | 秒 |
S | 小数秒 |
+/-hh:mm | 时区偏移 |
+/-hhmm | 时区偏移 |
+/-hh | 时区偏移 |
2、示例如下
--使用示例 | 对应输出 | 对应函数序号
to_date(now()) 2022-06-13 1
to_timestamp(1655078400) 2022-06-13 00:00:00 2
to_timestamp('2022-06-13','yyyy-MM-dd') 2022-06-13 00:00:00 3
to_utc_timestamp(now(),'Asia/Shanghai') 2022-06-13 10:13:20.886666000 4
from_timestamp(now(),'yyyy/MM') 2022/06 5
from_timestamp('2022-06-13','yyyy/MM') 2022/06 6
from_unixtime(1655078400) 2022-06-13 00:00:00 7
from_unixtime(1655078400,'yyyy/MM') 2022/06 8
from_utc_timestamp(now(),'Asia/Shanghai') 2022-06-14 02:13:20.886666000 9
unix_timestamp('2022-06-13') 1612368000 10