HIVE 的时间转换函数

本文介绍了Hive中用于时间转换和日期操作的函数,包括unix_timestamp()、from_unixtime()、CURRENT_DATE、to_date()、last_day()、next_day()等,并展示了如何计算日期差值和提取时间元素。还提到了date_format()和DATE_FORMAT()函数在格式化日期方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HIVE 的时间转换函数。
1,select unix_timestamp() 可以得到当前时间的时间戳。
select unix_timestamp(时间格式) 可以得到当前时间的时间戳。两个时间戳进行相减,可以得到两个时间相差的秒数。
SELECT from_unixtime(unix_timestamp()) 可以将时间戳转换成相应的时间格式。
SELECT CURRENT_DATE;可以得到当前的时间。
注:(
时间戳(timestamp):
通常是一个字符序列,唯一地标识某一刻的时间。数字时间戳技术是数字签名技术一种变种 的应用。
定义:
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。)

在大多数的sql中获取当前时间都是用now()函数即可,hive获取当前时间的函数与sql 不一样
hive有一个获得当前时区的UNIX时间戳:unix_timestamp
语法: unix_timestamp()
返回值: bigint
说明: 获得当前时区的UNIX时间戳
在这里插入图片描述

  有时我们需要的不是时间戳而是具体的当前时间:from_unixtime
  语法: from_unixtime(bigint unixtime, string format)
  可以将时间戳转化为相应的格式。

SELECT from_unixtime(unix_timestamp());

--2018-02-27 14:51:01

在这里插入图片描述
获取当前日期CURRENT_DATE。代码如下:

SELECT CURRENT_DATE;

--2018-02-27

2.日期转换函数

to_date,语法: to_date(string timestamp),返回值为string类型的日期
示例如下:

select to_date(‘2018-02-27 10:03:01’) ;

--2018-02-27

last_day(string date),返回这个月的最后一天的日期。

select last_day(‘2018-02-27 10:03:01’);

--2018-02-28

next_day,返回当前时间的下一个星期几所对应的日期 。如下

select next_day(‘2018-02-27 10:03:01’, ‘TU’);

 --2018-03-06

说明,输入日期为2-27,下个星期的周二为03-06,如果想要知道下周一的日期就是MO,周日就是SU,以此类推。
注意:
我跟无数多小白说过,西方国家周日是每周的第一天,所以日历和英语中都是现实周日就是周一。

3 .对比日期函数,经常用于日期之间比较大小,或者计算差值,日期加减。

日期差值:datadiff(结束日期,开始日期),返回结束日期减去开始日期的天数。

日期加减:date_add(时间,增加天数),返回值为时间天+增加天的日期;date_sub(时间,减少天数),返回日期减少天后的日期。

注意如果想知道相差多少个小时又怎么去求那?我们其实稍加改造即可。
  
  hour函数可以获得时间字段的小时数和datediff来获取两个日期相差的天数。然后利用天数*24+hour的差值即为所求,
  比如我们求2018-02-27 10:00:00 与 2018-02-25 12:00:00相差多少?
 实例代码如下:

select (hour(‘2018-02-27 10:00:00’)-hour(‘2018-02-25 12:00:00’)+(datediff(‘2018-02-27 10:00:00’,‘2018-02-25 12:00:00’))*24) as hour_subValue

--46 

补充一个:返回当前时间下再增加num_months个月的日期 add_months(string start_date, int num_months)
  
上面介绍了hour函数,那么我们也会需要其他的时间提取,不多说直接看代码,年月日时分秒:

select year('2018-02-27 10:00:00'),month('2018-02-27 10:00:00'),day('2018-02-27 10:00:00'),hour('2018-02-27 10:00:00'),minute('2018-02-27 10:00:00'),second('2018-02-27 10:00:00'),weekofyear('2018-02-27 10:00:00'); 

--2018    2    27    10    0    0    9

补充:quarter,返回当前本年度第几个季度。

DAYOFMONTH(date),它和data()函数都可以返回当前的天数日期。

返回月份日期的当天数,在范围为0〜31。

这下问题来了。获取到了当期的日期怎么获取到上个月的时间那。尝试用下面的函数进行获取;

SELECT SUBSTR(DATE_SUB(FROM_UNIXTIME(UNIX_TIMESTAMP()),30),1,7) AS mo  

通过DATE_SUB()函数对获取的时间戳进行操作,对日期进行相减,突然发现要得到上个月的时间,我们的月份的时间都不确定,这里用30天,肯定不行。

有开始发现新的方法:

SELECT SUBSTR(DATE_SUB(FROM_UNIXTIME(UNIX_TIMESTAMP()),DAYOFMONTH(FROM_UNIXTIME(UNIX_TIMESTAMP()))),1,7) AS mo

还是使用的DATE_SUB对日期进行操作,这次是将后面那个参数设置为获取到当前的日期,相减就是上个月最后一天,也是代表上个月。

3 , date_format() 函数与dateformat()函数,是不相同的。
dataformat()函数,可以在不加额外参数的情况下,将"2019-06-07",转换成,“20190607”
即dateformat(“2019-06-07”)
DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。
DATE_FORMAT(date,format)
date 参数是合法的日期。format 规定日期/时间的输出格式。

可以使用的格式有:

格式 描述
%a 缩写星期名
%b 缩写月名
%c 月,数值
%D 带有英文前缀的月中的天
%d 月的天,数值(00-31)
%e 月的天,数值(0-31)
%f 微秒
%H 小时 (00-23)
%h 小时 (01-12)
%I 小时 (01-12)
%i 分钟,数值(00-59)
%j 年的天 (001-366)
%k 小时 (0-23)
%l 小时 (1-12)
%M 月名
%m 月,数值(00-12)
%p AM 或 PM
%r 时间,12-小时(hh:mm:ss AM 或 PM)
%S 秒(00-59)
%s 秒(00-59)
%T 时间, 24-小时 (hh:mm:ss)
%U 周 (00-53) 星期日是一周的第一天
%u 周 (00-53) 星期一是一周的第一天
%V 周 (01-53) 星期日是一周的第一天,与 %X 使用
%v 周 (01-53) 星期一是一周的第一天,与 %x 使用
%W 星期名
%w 周的天 (0=星期日, 6=星期六)
%X 年,其中的星期日是周的第一天,4 位,与 %V 使用
%x 年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y 年,4 位
%y 年,2 位

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值