【hive】时间相关函数的使用(时间戳函数unix_timestamp()/from_unixtime()、日期处理函数datediff()/date_sub()/date_add()等)

这篇具有很好参考价值的文章主要介绍了【hive】时间相关函数的使用(时间戳函数unix_timestamp()/from_unixtime()、日期处理函数datediff()/date_sub()/date_add()等)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、时间戳函数

1、unix_timestamp()

  • unix_timestamp() 无参数调用,获取当前系统时间戳为10位的bigint类型数值,该数值只精确到秒。
select unix_timestamp();
> 1680227307 
  • unix_timestamp(string timestamp) 输入格式默认为“yyyy-MM-dd HH:mm:ss”,如不符合则返回null。
select unix_timestamp('2023-03-31 01:48:27') ; 
> 1680227307

select unix_timestamp('2023-03-31');
> NULL
  • unix_timestamp(string date,string pattern) 将指定时间格式的字符串转化成时间戳,如不符合则返回null。
--固定日期转换成时间戳
select unix_timestamp('2023-03-31','yyyy-MM-dd');
> 1680220800 

select unix_timestamp('2023-03-31 01:48:27','yyyy-MM-dd HH:mm:ss');  
> 1680227307

select unix_timestamp('2023-03-31T10:02:41Z', "yyyy-MM-dd'T'HH:mm:ss'Z'");
> 1680256961

select unix_timestamp('2023-03-31','yyyy-MM-dd HH:mm:ss')   
> NULL
  • unix_timestamp() - unix_timestamp()是两个时间转换为timestamp之后相减,timestamp单位是秒,相减之后是两个时间之间相差的秒数。

cast((unix_timestamp() - unix_timestamp()) % 60 as int) --是相差的秒数。
cast((unix_timestamp() - unix_timestamp()) / 60 as int) % 60 --是相差的分钟数。
cast((unix_timestamp() - unix_timestamp()) / (60 * 60) as int) % 24 --是相差的小时数。
concat(cast((unix_timestamp() - unix_timestamp()) / (60 * 60 * 24) as int) --是相差的天数。

--是相差的秒数
select unix_timestamp('20230329185800','yyyyMMddHHmmss')- unix_timestamp('20230329185604','yyyyMMddHHmmss');
> 56
select cast((unix_timestamp('20230329185800','yyyyMMddHHmmss')- unix_timestamp('20230329185604','yyyyMMddHHmmss'))%60 AS int);
> 56

--是相差的分钟数
select cast((unix_timestamp('20230329185800','yyyyMMddHHmmss')- unix_timestamp('20230329185604','yyyyMMddHHmmss'))/60 AS int);
> 1

--是相差的小时数
select cast((unix_timestamp('20230329215800','yyyyMMddHHmmss')- unix_timestamp('20230329185604','yyyyMMddHHmmss'))/(60 * 60) AS int) % 24;
> 3

--是相差的天数
select cast((unix_timestamp('20230331185800','yyyyMMddHHmmss')- unix_timestamp('20230329185604','yyyyMMddHHmmss'))/(60 * 60 * 24) AS int)  ;
> 2

注意:unix_timestamp 类第一个参数只接受 string 类型

2、from_unixtime()

  • from_unixtime(bigint unixtime,string format) 将时间戳秒数转化成UTC时间,并用字符串表示,可通过format规定时间格式,指定输出的时间格式。其中unixtime是10位的时间戳值,而13位的所谓毫秒是不可以的。
-- 时间戳转换成固定日期
select from_unixtime(1680257881,'yyyy-MM-dd HH:mm:ss');
> 2023-03-31 10:18:01

select from_unixtime(1680257881,'yyyy-MM-dd');
> 2023-03-31

select from_unixtime(unix_timestamp('31/Mar/2023:10:18:01 +0800', 'dd/MMM/yyy:HH:mm:ss Z'))
> 2023-03-31 02:18:01

select from_unixtime(1680257881);
> 2023-03-31 10:18:01 

-- 取当前系统时间
select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss');
> 2023-03-31 02:37:17

注意:from_unixtime 类 第一个参数只接受 bigint 类型。

3、unix_timestamp()与from_unixtime()结合使用

举例:已知通话开始时间为 “20230329185604”,通话时长为56秒,计算通话结束的时刻。

select from_unixtime((unix_timestamp(concat(substr('20230329185604',0,4),'-',substr('20230329185604',5,2),'-',substr('20230329185604',7,2),' ',substr('20230329185604',9,2),':',substr('20230329185604',11,2),':',substr('20230329185604',13,2)))+56),'yyyy-MM-dd HH:mm:ss');
> 2023-03-29 18:57:00 

select from_unixtime((unix_timestamp('20230329185604','yyyyMMddHHmmss')+56),'yyyy-MM-dd HH:mm:ss');
> 2023-03-29 18:57:00 

总结

1.Hive中获取时间戳的方式为unix_timestamp()函数,该函数只能够精确到秒级别的时间,对于时间精确到要求高的应用则该函数并不适合。

2.Hive获取当前时间毫秒级别的时间戳时需要使用cast函数将current_timestamp()转为double类型并乘以1000,则得到毫秒级别的时间戳。

3.对于Hive库中存储的毫秒精度的时间戳,为了确保时间精度不损失则需要使用to_utc_timestamp()函数,该函数支持毫秒级别的时间错,但需要指定当前时区。

-- 1.Hive中使用current_timestamp()函数获取当前时间,精确到毫秒。
select current_timestamp();
> 2023-03-31 11:18:48.184 


--2.Hive中获取当前时间戳为10位的bigint类型数值,该数值只精确到秒级别。
select unix_timestamp(current_timestamp());   
> 1680261703

--3.Hive中将时间戳转换为日期类型,结果可以看到时间的毫秒是无法正常获取到,因为时间戳只是精确到秒级别的,from_unixtime()函数也只支持秒级别的时间戳转换。
select from_unixtime(1680261703,'yyyy-MM-dd HH:mm:ss:SSS');
> 2023-03-31 11:21:43:000

-4.Hive中获取毫秒级别的时间戳,获取到了一个13位的数值,该数值精确到毫秒即为当前的时间的时间戳。
select current_timestamp(), cast(current_timestamp() as double) ;

+--------------------------+-------------------+
|           _c0            |        _c1        |
+--------------------------+-------------------+
| 2023-03-31 11:25:26.802  | 1.680261926802E9  |
+--------------------------+-------------------+

--5.Hive中处理毫秒级别的时间戳,使用Hive提供的to_utc_timestamp()函数将毫秒级别的时间戳转换为相应的时间并且精确到了毫秒,与上一步获取时间戳的时间一致。
select to_utc_timestamp(1.680261926802E9, 'GMT');
> 2023-03-31 11:25:26.802  

4.Hive中将十三位时间戳转换成日期,需要将“十三位时间戳” 除以1000并转为bigint类型,使用from_unixtime()转成想要的日期格式。

--十三位时间戳转换成日期,将十位时间戳/1000,转为bigint类型
select from_unixtime(cast(1679206709158/1000 as bigint),'yyyy-MM-dd HH:mm:ss');
> 2023-03-19 06:18:29

二、日期处理函数

1、date_format()

  • date_format(expr, fmt) 将时间戳转换为 fmt 格式的字符串
    expr:DATE、TIMESTAMP(“YYYY-MM-DD:HH-MM-SS”) 或有效日期/时间格式的 STRING。
    fmt:描述所需格式的 STRING 表达式。
select date_format('2023-03-31','yyyy-MM');
> 2023-03

select date_format('2023-03-31','yyyyMMdd');
> 20230331

select date_format('2023/03/31', 'y'); --识别不了/ 这种分隔符
> NULL

2、date_sub()

  • date_sub(startDate,numDays) 对当前日期减少天数,返回日期。
    startDate:日期表达式。
    numDays:一个整数表达式。

date_sub(‘yyyy-MM-dd’,n/-m) ,返回初始日期 n 天前,m 天后的日期。

select date_sub('2023-03-31',5); --2023-03-31 5天前
> 2023-03-26

select date_sub('2023-03-31',-2); --2023-03-31 2天后
> 2023-04-02

3、date_add()

  • date_add(startDate,numDays) 对当前日期增加的天数,返回日期。
    startDate:日期表达式。
    numDays:一个整数表达式。

date_sub(‘yyyy-MM-dd’,n/-m) ,返回初始日期 n 天后,m 天前的日期。

select date_add('2023-03-31',5); --2023-03-31 5天后
> 2023-04-05

select date_add('2023-03-31',-2); --2023-03-31 2天前
> 2023-03-29

4、datediff()

  • datediff(‘endDate’,‘startDate’) 返回前后日期之间的天数差,int类型。
    endDate:日期表达式。
    startDate:日期表达式。
select datediff('2023-03-31','2023-03-21');
> 10

select datediff('2023-03-31','2023-04-05');
> -5

--"yyyy/MM/dd"转换成"yyyy-MM-dd"
select datediff(regexp_replace('2023/03/31', "/", "-"), regexp_replace('2023/03/12', "/", "-"));
> 19

-- 求时间差
select datediff(from_unixtime(unix_timestamp('20221001','yyyyMMdd'),'yyyy-MM-dd'),from_unixtime(unix_timestamp(substr('2022-09-09',1,10),'yyyy-MM-dd'),'yyyy-MM-dd'));
> 22

5、last_day()

  • last_day(expr) 求当月最后一天
    expr:一个 DATE 表达式。
select last_day('2023-03-21');
> 2023-03-31
select last_day('2023-03-21 10:18:01');
> 2023-03-31

6、next_day()

  • next_day(expr, dayOfWeek),返回一个DATE。
    expr:一个 DATE 表达式。
    dayOfWeek:标识一周中某一天的 STRING 表达式。

dayOfWeek 必须是以下之一(不区分大小写):
‘SU’, ‘SUN’, ‘SUNDAY’
‘MO’, ‘MON’, ‘MONDAY’
‘TU’, ‘TUE’, ‘TUESDAY’
‘WE’, ‘WED’, ‘WEDNESDAY’
‘TH’, ‘THU’, ‘THURSDAY’
‘FR’, ‘FRI’, ‘FRIDAY’
‘SA’, ‘SAT’, ‘SATURDAY’

--取当前天的下一个周一
select next_day('2023-03-31','MO');
> 2023-04-03

--取当前周的周一
select date_sub(next_day('2023-03-31','MO'),7);
> 2023-03-27

7、add_months()

  • add_months(startDate, numMonths)
    startDate:一个 DATE 表达式。
    numMonths:整数。

add_months(‘yyyy-MM-dd’,n/-m) ,返回初始日期 n 月后,m 月前的日期。

select add_months('2023-03-01',1); --1个月后
> 2023-04-01

select add_months('2023-03-01',-6); --6个月前
> 2022-09-01

8、其他相关函数

#1、返回当天的三种方式
select current_date;
> 2023-03-31
select current_timestamp;
> 2023-03-31 15:20:11.566  
select from_unixtime(unix_timestamp());
> 2023-03-31 07:20:30

#2、返回日期中的年
select year('2023-03-31 01:48:27');
> 2023 

#3、返回日期中的月份
select month('2023-03-31 01:48:27');
> 3

#4、返回日期中的日
select day('2023-03-31 01:48:27');
> 31

#5、返回日期中的时
select hour('2023-03-31 01:48:27');
> 1

#6、返回日期中的分
select minute('2023-03-31 01:48:27');
> 48

#7、返回日期中的秒
select second('2023-03-31 01:48:27');
> 27

#8、返回日期中的当前月份的第几天
select dayofmonth('2023-03-31 01:48:27');
> 31

#9、返回日期中的当前的周数(今年第几周)
select weekofyear('2023-03-31 01:48:27');
> 13

#10、返回当月第一天
select date_sub(current_date,dayofmonth(current_date)-1);
> 2023-03-01 
select trunc('2023-03-31','MM');
> 2023-03-01 
select from_unixtime(unix_timestamp(date_format(from_unixtime(unix_timestamp('20230331','yyyymmdd'),'yyyy-mm-dd'),'yyyy-MM-01'),'yyyy-MM-dd'),'yyyyMMdd')
> 20230301 

#11、返回当年的第一天
select trunc('2023-03-31','YEAR');
> 2023-01-01

总结

1.date_format()/date_sub()/date_add()/datediff()/last_day()/next_day()/add_months 函数日期只能为’yyyy-MM-dd’格式 & 'yyyy-MM-dd HH:mm:ss’格式文章来源地址https://www.toymoban.com/news/detail-716858.html

到了这里,关于【hive】时间相关函数的使用(时间戳函数unix_timestamp()/from_unixtime()、日期处理函数datediff()/date_sub()/date_add()等)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL使用技巧(4.1)Hive日期时间函数

    常用的格式化(format)标识符: 本章节每一行代码后都有运算说明和执行结果样例,例如 - - 返回当前系统日期 yyyy-MM-dd, 【2023-04-01】 原生hive中不支持 now() 的写法,经过加工的工具(TDWTDH)可能支持,不绝对。 unix_timestamp() 也会返回一个时间戳,但并不是系统当前时间的时间

    2024年02月12日
    浏览(44)
  • logstash毫秒时间戳转日期以及使用业务日志时间戳替换原始@timestamp

    在使用Kibana观察日志排查问题时发现存在很多组的@timestamp 数据一样,如下所示 详细观察内部数据发现其中日志数据有一个timestamp字段保存的是业务日志的毫秒级时间戳,经过和@timestamp数据对比发现二者的时间不匹配。经过分析得知@timestamp是按照logstash插入es数据的时间来排

    2023年04月11日
    浏览(39)
  • UNIX基础知识:UNIX体系结构、登录、文件和目录、输入和输出、程序和进程、出错处理、用户标识、信号、时间值、系统调用和库函数

            所有的操作系统都为运行在其上的程序提供服务,比如:执行新程序、打开文件、读写文件、分配存储区、获得系统当前时间等等         从严格意义上来说,操作系统可被定义为一种软件,它控制计算机硬件资源,提供程序运行的环境。我们通常将这种软件称为

    2024年02月13日
    浏览(53)
  • MySQL 中 DATETIME 和 TIMESTAMP 时间类型的区别及使用场景

    在 MySQL 中有两种存储时间的数据类型 DATETIME 和 TIMESTAMP ,它们在数据库实际应用中,各有各的优势和劣势。 两个数据类型存储时间的格式一致。均为 YYYY-MM-DD HH:MM:SS 两个数据类型都包含「日期」和「时间」部分。 两个数据类型都可以存储微秒的小数秒(秒后6位小数秒) DATET

    2023年04月08日
    浏览(48)
  • 【hive】相关性函数进行相关性分析

    在Hive SQL中,使用类似的相关性函数进行相关性分析。常见的相关性函数包括CORR、COVAR_POP、COVAR_SAMP、STDDEV_POP、STDDEV_SAMP等。 举个例子,假设有一个表格sales,其中包含两列数据 sales_amt 和 advertising_amt ,我们可以使用CORR函数来计算这两列数据的相关性: 这将返回一个值,表示

    2024年02月21日
    浏览(40)
  • Hive的时间操作函数

    hive 里面的时间函数有很多,今天单讲dayofweek函数,背景:有时候不仅要出日报,还要出周报,需要很多天归为同一周,求sum或者均值; 在Hive中,可以使用dayofweek()函数来计算某个日期是一周的第几天。该函数的语法如下: 其中,date表示要计算的日期,可以是一个日期字符

    2024年04月29日
    浏览(30)
  • Hive--时间函数大全

    注:第二个参数为时间格式,默认是’yyyy-MM-dd HH:mm:ss’ 注:to_date() 默认转化格式为’yyyy-MM-dd’ 注:next_day()第⼆个参数⽀持⼩写、⼤写、缩写(su/sun/sunday)

    2024年02月07日
    浏览(46)
  • hive时间和字符串互转,时间函数

    hive里经常需要将字符串转化为date或timestamp 或者转化为日期格式的string 先说一个简单的 cast(xx as date/string/timestamp) 这个大多情况都可以用 1.to_date to_date只保留年月日,参数必须是string类型的yyyy-MM-dd HH:mm:ss或者date或timestamp类型, 返回值是date类型,注意这个返回类型,这个是少数

    2024年02月02日
    浏览(42)
  • (05) Hive的相关概念——函数介绍

    目录 一、各数据类型的基础知识点 1.1 数值类型 整数 小数 float double(常用) decimal(针对高精度) 1.2 日期类型 date datetime timestamp time year 1.3 字符串类型 char varchar / varchar2 blob /text  tinyblob / tinytext mediumblob / mediumtext longblob / longtext string(常用) 二、Hive中的常用函数 2.1 单行函数 2.1

    2024年02月20日
    浏览(45)
  • 【Hive】HQL Array 『CRUD | 相关函数』

    语法: array基本数据类型 注意是 ,不是 () 例子: 创建表时: 字段填充时: cast(null as arraystring) as XXX 没有删除,只能覆盖 注意:数组越界会报错。 array() :创建一个数组。例如,array(1,2,3)将创建一个包含1、2、3三个元素的数组。 array_max(array) :返回数组中的最大值。例如,

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包