在使用hive建设数据仓库的过程或者做数据模型、数据分析时,经常会用到各种各样的时间日期。诸如,求7天前、15天前的数据,查询昨天或当天几个小时内的数据,这些都需要用到时间函数,要求我们拿到具体的时间才能进行下一步工作。
一、Hive中常用的几种日期处理函数
1,datediff函数,datediff函数用来求两个指定日期之间的差,用于返回两个天数之间的日期。
语法:datediff(date1,date2)
说明:date1 和 date2 要是 参数是合法的日期或日期/时间表达式。
当日期 date1<date2 时函数返回值为正数,当 date1=date2 时函数返回值为0,当 date1>date2 时函数返回值为负数。
//查询过去n天日期 包含当天 小于等于0SELECT * FROM dual WHERE DATEDIFF(日期字段,NOW()) <=0 AND DATEDIFF(日期字段,NOW())>-n//查询过去n天日期 不包含当天 小于 0SELECT * FROM dual WHERE DATEDIFF(日期字段,NOW()) <0 AND DATEDIFF(日期字段,NOW())>-n
例子:
表里原始数据:date_code2021-08-092021-08-102021-08-112021-08-122021-08-132021-08-142021-08-152021-08-162021-08-172021-08-182021-08-192021-08-20//查询过去10天内的数据,且不包含当天SELECTdate_codeFROM dualWHEREdatediff(date_code,current_date()) < 0ANDdatediff(date_code,current_date()) > -10返回结果:2021-08-112021-08-122021-08-132021-08-142021-08-152021-08-162021-08-172021-08-182021-08-19//查询过去10天内的数据,含当天SELECTdate_codeFROM dualWHEREdatediff(date_code,current_date()) <= 0ANDdatediff(date_code,current_date()) > -10返回结果:2021-08-112021-08-122021-08-132021-08-142021-08-152021-08-162021-08-172021-08-182021-08-192021-08-20
注意now() 、current_timestamp()、current_date()这三种获取当前系统时间的区别:now() 、current_timestamp()、current_date()三者都是获取当前系统时间,但now() 、current_timestamp()获取的是带时分秒的时间,current_date()获取的是不带时分秒的时间。
SELECTnow() AS date1,current_date() AS date2,current_timestamp() AS date3FROM dual返回结果:2021-08-14 15:49:13.532021-08-142021-08-14 15:49:13.53
2,date_add 日期增加函数,查询并返回未来天数
语法:date_add(startdate, days)
说明:返回开始日期startdate增加days天后的日期。
//查询未来n天日期SELECT DATE_ADD(日期字段,n) FROM dual
例子:
//查询10天后的日期SELECTdate_add('2021-08-14',10) AS date_codeFROMdual返回结果:2021-08-24
3,date_sub 日期减少函数,查询并返回过去的天数
语法:date_sub(startdate, days)
说明:返回开始日期startdate减少days天后的日期。
//查询过去n天的日期SELECT DATE_SUB(日期字段,n) FROM dual
例子:
//查询10天前的日期SELECTdate_add('2021-08-14',10) AS date_codeFROMdual返回结果:2020-08-04
上述三种日期函数的应用
1,查询当天的所有数据
SELECT * FROM tablename WHERE DATEDIFF(日期字段,NOW()) = 0
2,查询昨天的所有数据
SELECT * FROM tablename WHERE DATEDIFF(日期字段,NOW())=-1
3,查询第n天的所有数据。注意当n为负数时,表示查询过去第n天的数据;当n为正数时,表示查询未来第n天的数据
//当n为负数时,表示过去第n天的数据SELECT * FROM tablename DATEDIFF(字段,NOW())=n
二、日期与时间戳的使用
timestamp
timestamp是UTC时间,可以是以秒为单位的整数,带精度的浮点数,最大精确到小数点后9位,纳秒级;格式化后的字符串 yyyy-MM-dd HH:mm:ss.fffffffff
Date
Hive中的Date只支持yyyy-MM-dd格式的日期,其余写法都是错误的,如需带上时分秒,请使用timestamp。
例子:
--建带有timestamp格式字段的表rcreate table time_dual(time timestamp);--插入一个数据(一个数据占一个文件)insert into table time_dual values('2021-08-14 15:30:49.223');--建带有date格式字段的表create table date_dual(dt date);--插入一个数据,虽然命令没报错,但却没有将数据写入文件。insert into table date_dual values('2021-08-14 15:18:48.807');--将日期覆盖插入的date_dual(将目录下的所有都删掉,再写入)insert overwrite table date_dual values('2021-08-14');
注意:into是插入,overwrite是覆盖。
获取当前timestamp:
select current_timestamp() from dual --返回值: timestamp时间戳
获取当前日期:
select current_date() from dual --返回值:date日期时间
格式化timestamp/date为字符串:
date_format(date/timestamp/string ts, string fmt)--返回值:字符串日期
Unix时间戳
把 当前时间 或 时间字符串 转为 Unix时间戳
--获取当前timestamp的Unix时间戳select unix_timestamp(current_timestamp);--获取指定字符串的Unix时间戳select unix_timestamp('2021-08-14 12:00:00');
把Unix时间戳 转为 时间字符串
from_unixtime(bigint unixtime[string format])--unixtime:从1970-01-01 00:00:00 UTC到指定时间的秒数--format:目标转换格式--返回值: stringb
例子:
--转换成 yyyy-MM-dd HH:mm:ss 类型的时间select from_unixtime(1530755469) from dual;--转换成指定格式的字符串select from_unixtime(1530755469, "yyyy-MM-dd") from dual;




