暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Hive时间函数汇总

大数据干饭人 2021-07-02
935

常用时间操作函数汇总表格

函数
返回值类型
函数说明
from_unixtime(unix_time [,format])string
UNIX时间戳(秒数)转为日期格式字符串,可以设定返回的日期格式[format],不指定时默认为yyyy-MM-dd HH:mm:ss格式
unix_timestamp()bigint
返回当前时间戳,已被标记弃用
unix_timestamp(date [,pattern]) bigint
返回指定日期的时间戳,pattern为日期的格式
current_timestamp()
bigint
返回当前时间戳(毫秒,13位)
to_date(expr)
string
返回日期时间字段中的日期部分
year(param)
int
返回日期中的年份
month(param)int
返回日期中的月份
day(param)int
返回日期中的天数
hour(param)
int
返回日期中的小时
minute(param)int
返回日期中的分钟
second(param)int
返回日期中的秒
weekofyear(date)
int
返回日期在当前的周数
date_add(start_date, num_days)string
返回日期增加num_days天后的日期
date_sub(start_date, num_days)string返回日期减去num_days天后的日期
datediff(date1, date2)int
返回两个日期相差的天数
add_months(start_date, num_months[, output_date_format])string
返回start_date增加num_months月之后的日期,可指定输出格式,默认为yyyy-MM-dd

months_between(date1, date2)

int
返回两个日期的月份差
last_day(date)
string
返回日期所在月的最后一天日期
trunc(date, fmt)
string
返回截断日期到指定的日期精度,fmt格式仅支持月(MONTH/MON/MM)或者年(YEAR/YYYY/YY)
next_day(start_date, day_of_week)
string
返回晚于start_date的下一个星期几的日期(day_of_week可以用两个字母、三个字母或者英文全拼来表示,比如MO、tue、friday)

注:用 [ ] 括起来的表示是可选参数。


另外,在遇到不知道如何使用的函数时,下面这个命令可以查看函数详细信息,extended关键字展示了函数的使用参考案例:

    desc function extended from_unixtime;


    演示几个案例


    1、获取当前时间戳


    select unix_timestamp(); 
    --返回结果:1619404342


    unix_timestamp(void)将被弃用,使用unix_timestamp(current_timestamp())替代

    select unix_timestamp(current_timestamp());
    --返回结果:1619404342


    上面默认是获取的10位的秒级时间戳,获取13位的毫秒时间戳方式为:

    select cast(cast(current_timestamp() as double)*1000 as bigint);
    --返回结果:1619406009385



    2、获取当前时间


    select from_unixtime(unix_timestamp(current_timestamp())); 
    --返回结果:2021-04-26 10:37:52



    3、日期时间转为时间戳,unix_timestamp(date [,pattern]) 


    select unix_timestamp('2021-04-26 10:37:52');
    --返回结果:1619404342


    如果入参日期时间格式为’yyyy-MM-dd HH:mm:ss‘,不需要第二个参数pattern;若入参日期时间格式为’yyyy-MM-dd‘,需要指定其对应的pattern格式,例如:

    select unix_timestamp('2021-04-26','yyyy-MM-dd');
    --返回结果:1619366400


    另外需要知道的是,所获取的时间戳为1970-01-01 08:00:00到现今的秒数,验证下这个时间点的时间戳,结果为0:

    select unix_timestamp('1970-01-01 08:00:00');
    --返回结果:0



    4、时间转为日期时间,from_unixtime(unix_time [,format])


    select from_unixtime(1619404672);
    --返回结果:2021-04-26 10:37:52

    select from_unixtime(1619404672,'yyyyMMdd');
    --返回结果:20210426



    要注意的是时间戳参数应是10位的秒时间戳。



    5、获取N天前的日期


    第一印象是使用date_sub(start_date, num_days)这种函数,但是date_sub的局限是参数start_date的格式必须为‘yyyy-MM-dd HH:mm:ss’或者‘yyyy-MM-dd’,我们查看函数详情看下:


    select date_sub(current_date(),3);
    --返回结果:2021-04-23
    select date_sub('20210426',3);
    --返回结果:NULL


    可见date_sub函数对于不同的格式未必有效。

    但是类型“20210426”这种格式是我们常用的,要求3天的日期的话,该如何算呢

    select from_unixtime(unix_timestamp('20210426','yyyyMMdd')-3*86400,'yyyyMMdd');
    --返回结果:20210423


    这种方式不仅入参的时间格式灵活,而且返回值的格式也可根据自身需要设定。



    6、获取日期所在月的第一天日期


    select trunc('2021-04-26','MM');
    --返回结果:2021-04-01
    select trunc('2021-04-26','YY');
    --返回结果:2021-01-01



    7、获取日期所在月的最后一天日期


    select last_day('2021-04-26');
    --返回结果:2021-04-30
    select last_day('2021-02-26');
    --返回结果:2021-02-28



    8、获取日期所在周的周日的日期


    select date_add(next_day('2021-04-26','MO'),-1); 
    --返回结果:2021-05-02


    通过next_day(date,'MO')先算出下周周一的日期,再减去一天就是这周的周日。


    文章转载自大数据干饭人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论