Impala中的时间函数

持续更新中

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、获取当前时间

序号函数输出类型说明
1now()timestamp系统当前时间的时间戳
2current_timestamp()timestamp系统当前时间的时间戳
3unix_timestamp()bigint系统当前时间的时间戳整数形式
4timeofday()string系统当前日期和时间的字符串表示形式
5utc_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、获取指定时间

序号函数输出类型说明时间颗粒度备注
1year(timestamp/date date)int获取年
2dayofyear(timestamp/date date)int获取本年第多少天年/日
3quarter(timestamp/date date)int季度(1,2,3,4)
4month(timestamp/date date)int获取月数
5monthname(timestamp/date date)timestamp/date月份名称
6day(timestamp/date date)int获取本月第多少天月/日
7dayofmonth(timestamp/date date)int获取本月第多少天月/日
8last_day(timestamp/date date)string月末最后一天月/日获取每月最后一天,可用于统计每月月末数据
9week(timestamp/date date)int获取周(1-53)
10weekofyear(timestamp/date date)int获取周(1-53)按照日历周,从周一到周天为1周,可用于统计每周期间数
11dayofweek(timestamp/date date)int本周第多少天,周日算第一天周/日
12dayname(timestamp/datedate)string获取星期几周/日
13next_day(timestamp/date date,String weekday)timestamp/date获取天(返回下一周指定星期几的日期)周/日String weekday 用于指定星期几
14hour(timestamp date)int获取小时
15minute(timestamp date)int获取分钟
16second(timestamp date)int获取秒
17millisecond (timestamp date)int获取毫秒毫秒
18extract(timestamp/date date,String unit)bigint获取参数指定的时间单位指定时间单位String unit用于指定时间单位
19extract(unit from timestamp/date date)bigint获取参数指定的时间单位指定时间单位String unit用于指定时间单位
20date_part(string unit,timestamp timestamp)bigint获取参数指定的时间单位指定时间单位String unit用于指定时间单位
21trunc(timestamp/date date,String unit)timestamp/date获取截断为指定单位的时间指定时间单位String unit用于指定时间单位,指定‘MM’可以当作月初第1天
22date_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

三、时间计算函数

序号函数输出类型说明时间颗粒度备注
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增加指定天数date后面不加s
11date_sub(timestamp/date startdate, int/bigint days)timestamp/date减少指定天数date后面不加s
12adddate(timestamp/date startdate, int/int days)timestamp/date增加指定天数date后面不加s
13subdate(timestamp/date startdate,bigint/int days)timestamp/date减少指定天数date后面不加s
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减少指定秒数
20date_add(timestamp/date startdate, interval_expression)timestamp/date使用参数计算日期增量值(增加)特定时间date后面不加s
21date_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/24int输出相差小数的天数,小数部分即为相差未满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

五、时间转换函数

序号函数输出类型说明时间颗粒度备注
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进行格式化特定时间在maxcompute中to_char()可以起到同样的效果
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时间戳impala可用
12unix_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

     
  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值