[1144]Hive常用日期格式转换

这篇具有很好参考价值的文章主要介绍了[1144]Hive常用日期格式转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

获取当前时间

  • 获取当前时间戳
-- Hive中获取当前时间戳,默认使用unix_timestamp()函数,精确到秒
select unix_timestamp(); -- 1677062942
  • Hive中获取毫秒级别的时间戳
select current_timestamp() as current_time, cast(current_timestamp() as double) * 1000 as timestamp;

2019-06-02 15:44:23.324	1559461463324
  • 把时间戳转为正常的日期
select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss')
select from_unixtime(unix_timestamp(),'yyyy-MM-dd')
 
SELECT from_unixtime(1571709884123/1000,'yyyy-MM-dd HH:dd:ss.sss');
2019-10-22 10:22:44.044
  • 业务中有时存放的是包含毫秒的整数,需要先转换为秒
select from_unixtime(cast(create_time/1000 as bigint),'yyyyMMdd') as dt
  • 返回当天日期或时间
SELECT CURRENT_DATE;   --2017-06-15
select current_date();   -- 2021-10-22

-- Hive中使用current_timestamp()函数获取当前时间,精确到毫秒
select current_timestamp;  --2018-06-18 10:37:53.278
select current_timestamp();  --2023-02-22 18:46:18.406
select from_unixtime(unix_timestamp());  --2017-06-15 19:55:04
select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss.SSS') as etl_time;  --2023-02-22 18:46:18.406

select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss') as etl_time;  --2023-02-22 18:46:18
select date_format(current_timestamp(), 'yyyy-MM-dd HH:mm:ss') as etl_time;  --2023-02-22 18:46:18

Hive中处理毫秒级别的时间戳

desc function extended to_utc_timestamp;

to_utc_timestamp(timestamp, string timezone) - Assumes given timestamp is in given timezone and converts to UTC (as of Hive 0.8.0)


select to_utc_timestamp(1559461463324, 'GMT');
+--------------------------+--+
|           _c0            |
+--------------------------+--+
| 2019-06-02 15:44:23.324  |
+--------------------------+--+
1 row selected (2.745 seconds)
  • 将毫秒级别的时间戳转换为指定格式的毫秒时间,SSS代表毫秒
select date_format(to_utc_timestamp(1559461463324, 'GMT'), 'yyyyMMddHHmmssSSS');
+--------------------+--+
|        _c0         |
+--------------------+--+
| 20190602154423324  |
+--------------------+--+
1 row selected (0.323 seconds)


select date_format(to_utc_timestamp(1559461463324, 'GMT'), 'yyyy/MM/dd HH:mm:ss.SSS');
+--------------------------+--+
|           _c0            |
+--------------------------+--+
| 2019/06/02 15:44:23.324  |
+--------------------------+--+
1 row selected (0.183 seconds)
  • 将毫秒级时间转化为毫秒级时间戳
select cast(from_utc_timestamp('2023-01-30 12:00:00.123', 'yyyy-MM-dd HH:mm:ss.SSS') as double) * 1000 as timestamp1;--1675051200123

日期格式转换

  • 日期格式转换 yyyyMMdd—>yyyy-MM-dd
select from_unixtime(unix_timestamp('20211022','yyyyMMdd'),"yyyy-MM-dd");
2021-10-22
  • 固定日期转换成时间戳
select unix_timestamp('2016-08-16','yyyy-MM-dd') --1471276800
select unix_timestamp('20160816','yyyyMMdd') --1471276800
select unix_timestamp('2016-08-16T10:02:41Z', "yyyy-MM-dd'T'HH:mm:ss'Z'") --1471312961
16/Mar/2017:12:25:01 +0800 转成正常格式(yyyy-MM-dd hh:mm:ss)
select from_unixtime(to_unix_timestamp('16/Mar/2017:12:25:01 +0800', 'dd/MMM/yyy:HH:mm:ss Z'))
  • 时间戳转换程固定日期
select from_unixtime(1471276800,'yyyy-MM-dd') --2016-08-16
select from_unixtime(1471276800,'yyyyMMdd') --20160816
select from_unixtime(1471312961) --    2016-08-16 10:02:41
select from_unixtime( unix_timestamp('20160816','yyyyMMdd'),'yyyy-MM-dd')  --2016-08-16
select date_format('2016-08-16','yyyyMMdd') --20160816
  • 字符串强制转换,获取日期
select to_date('2016-08-16 10:03:01') --2016-08-16
类似sql中的date
  • 截取日期部分
select substr('2021-10-22 17:34:56',1,10)
2021-10-22

select date_format('2021-10-22 17:34:56','yyyy-MM-dd')
2021-10-22

返回日期中的年,月,日,时,分,秒,当前的周数

  • 返回日期中的年
select year('2016-08-16 10:03:01') --2016
  • 返回日期中的月
select month('2016-08-16 10:03:01') --8
  • 返回日期中的日
select day('2016-08-16 10:03:01') --16
  • 返回日期中的时
select hour('2016-08-16 10:03:01') --10
  • 返回日期中的分
select minute('2016-08-16 10:03:01') --3
  • 返回日期中的秒
select second('2016-08-16 10:03:01') --1
  • 返回日期在当前的周数
select weekofyear('2016-08-16 10:03:01') --33

返回当月或当年的第一天

  • 返回当月的第一天
select trunc('2016-08-16','MM') --2016-08-01

select date_format(to_date(trunc(current_date(),'MM')),"yyyy-MM-dd");
2021-10-01
  • 返回当年的第一天
select trunc('2016-08-16','YEAR') --2016-01-01

计算日期差值

返回结束日期减去开始日期的天数

语法:datediff(string enddate,string startdate)
返回值: int
说明: 返回结束日期减去开始日期的天数。

select datediff('2016-08-16','2016-08-11') ;
5

需要注意的是datediff两个日期必须是’yyyy-MM-dd’的格式,否则执行结果会是NULL
例如:

select datediff('20221220','20221231');

执行结果:NULL

而在mysql中,

select datediff('20221220','20221231');

这种写法是支持的,执行结果 -11。

返回开始日期startdate增加days天后的日期

语法:date_add(string startdate, intdays)
返回值: string
说明: 返回开始日期startdate增加days天后的日期。

select date_add('2016-08-16',10)

需要注意的是intdays 可以是正数、也可以是负数,正数代表加,负数代表减。

返回开始日期startdate减少days天后的日期

语法:date_sub (string startdate,int days)
返回值: string
说明: 返回开始日期startdate减少days天后的日期。

select date_sub('2016-08-16',10)

前一日/昨日
select date_sub(current_date(),1);
2021-10-21

最近一个月/30天
select date_sub(current_date(),30);
2021-09-22

hive日期比较函数,虽然只是一个很小的知识点,但它在实际应用有很大的作用,掌握了往往有事半功倍的效果。

比如获取某张表昨日的分区 可以使用

regexp_replace(date_sub(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),1) ,'-','')

或者

date_format(date_sub(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),1),'yyyyMMdd')
前一日12点/昨日12点
select concat(date_format(date_sub(current_date(),1),'yyyy-MM-dd'),' ','12');
2021-10-21 12
计算时间相差的秒数,unix_timestamp精确到秒
select nvl(unix_timestamp(substr('2023-02-13 23:59:59.199',1,19)) - unix_timestamp(substr('2023-02-13 23:59:58.800',1,19)),0) as seconds;

select nvl(unix_timestamp('2023-02-13 23:59:59.199') - unix_timestamp('2023-02-13 23:59:58.800'),0) as seconds;

select nvl(unix_timestamp('2023-02-13 23:59:59.199','yyyy-MM-dd HH:mm:ss.SSS') - unix_timestamp('2023-02-13 23:59:58.800','yyyy-MM-dd HH:mm:ss.SSS'),0) as seconds;

特殊函数

weekofyear(date1)**:返回日期date1位于该年第几周。
如weekofyear('2019-03-06')=10

datediff(date1,date2)**:返回日期date1与date2相差的天数
如datediff('2019-03-06','2019-03-05')=1

date_add(date1,int1)**:返回日期date1加上int1的日期
如date_add('2019-03-06',1)='2019-03-07'

date_sub(date1,int1)**:返回日期date1减去int1的日期
如date_sub('2019-03-06',1)='2019-03-05'

months_between(date1,date2)**:返回date1与date2相差月份
如months_between('2019-03-06','2019-01-01')=2

add_months(date1,int1)**:返回date1加上int1个月的日期,int1可为负数
如add_months('2019-02-11',-1)='2019-01-11'

last_day(date1)**:返回date1所在月份最后一天
如last_day('2019-02-01')='2019-02-28'

next_day(date1,day1)**:返回日期date1的下个星期day1的日期。day1为星期X的英文前两字母
如next_day('2019-03-06','MO') 返回'2019-03-11'

trunc(date1,string1):**返回日期最开始年份或月份。string1可为年(YYYY/YY/YEAR)或月(MONTH/MON/MM)。
如trunc('2019-03-06','MM')='2019-03-01',trunc('2019-03-06','YYYY')='2019-01-01'

select split('12','\\.')[1]
select concat(1,'.',3)
select if(split('1.2','\\.')[1] is NULL,0,split('1.2','\\.')[1])

总结

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

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

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

参考:https://blog.csdn.net/wufagang/article/details/124025258
https://www.jianshu.com/p/55f9683c63f1
https://blog.csdn.net/m0_46689661/article/details/117734151
Hive中TimeStamp精度问题分析:https://blog.csdn.net/lz6363/article/details/90740061
https://blog.csdn.net/X8i0Bev/article/details/128391689文章来源地址https://www.toymoban.com/news/detail-773408.html

到了这里,关于[1144]Hive常用日期格式转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Hive-时间日期&trunc-日期与数字截取函数

    一、时间日期函数 1、获取当前时间 2、日期转时间戳 3、时间戳转日期 二、trunc - 日期与数字截取函数 1、日期截取 2、数字截取

    2024年02月11日
    浏览(46)
  • Hive时间日期函数一文详解+代码实例

    目录 前言 一、HiveSQL运行过程 二、Hive时间函数 1.获取当前时间 1.current_date() 2. current_timestamp() 3. unix_timestamp() 2.获取指定时间维度 1. year() 2.quarter() 3.month() 4.day() 5.hour() 6.minute() 7.second 8.weekofyear() 9. dayofweek()  10.last_day()  11.next_day() 12.trunc()  3.时间格式转换  1.to_date() 2. from_un

    2024年02月02日
    浏览(46)
  • Hive常用的日期函数

    注意: current_timestamp() 获取的时UTC默认时区。 给定一个时间戳可基于 from_utc_timestamp/to_utc_timestamp 进行转换。 注意: nbsp;nbsp; 如果当前年的第一个周,天数超过3天,那就是当前年的第一周; nbsp;nbsp; 如果当前年的第一个周,天数小于等于3天,那就是上一年的最后一周。 wee

    2024年02月07日
    浏览(43)
  • Hive常见时间日期函数的使用与问题整理

    这里整理一下Hive常见的时间函数和日期函数和用法,作为平时数据处理过程的一个检索和记录。 平时在数据处理过程中,如果不经常使用时间函数,一时间遇到一些时间上的处理,难免会想不起来。 hive本身提供的时间函数已经很丰富了,基本上能满足我们所有的需求,一些

    2024年02月08日
    浏览(47)
  • SQL使用技巧(4.1)Hive日期时间函数

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

    2024年02月12日
    浏览(45)
  • [22007] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]从字符串转换日期和/或时间时,转换失败。 (241)过滤非法日期格式数据

    出现这个错误是因为你在SQL Server中尝试将一个无效的字符串转换为日期或时间格式。为了解决这个问题,你需要过滤掉不合法的数据。 你可以使用TRY_CONVERT函数来尝试将字符串转换为日期或时间格式,如果转换失败,则返回NULL。然后你可以使用IS NOT NULL来过滤掉这些NULL值。

    2024年02月08日
    浏览(87)
  • hive sql,年月日 时分秒格式的数据,以15分钟为时间段,找出每一条数据所在时间段的上下界限时间值(15分钟分区)

    获取当前的年月日 时分秒 date_format(时间字段, ‘yyyy-MM-dd HH:mm:ss’) 将时间字段转为 2023-10-18 18:14:16 这种格式 在指定时间上增加15分钟 unix_timestamp:获取当前时间的UNIX时间戳(从 1970-01-01 00:00:00 UTC 到指定时间的秒数),然后加上 15*60 秒,即15分钟,就得到了15分钟后的时间戳

    2024年02月08日
    浏览(48)
  • 【js】时间和时间戳转换、日期格式化

    1、时间戳转换日期方法 (格式:2023-08-17) 2、日期字符串转时间戳 3、时间戳转换日期+时间方法 date:时间戳数字(格式:2023-08-17 14:11:01) 4、 获取日期中文格式

    2024年02月12日
    浏览(54)
  • Java:日期毫秒值和常见日期时间格式相互转换

    本文介绍了Java中,日期毫秒值和常见日期格式相互转换。 提示:以下是本篇文章正文内容,下面案例可供参考 代码示例: 代码示例: 如果想将指定时间转换为毫秒值,相对比较麻烦,这里提供两种方法供参考 利用Calendar.set() 利用DateFormat.parse() 本文介绍了Java中如何将毫秒

    2024年02月16日
    浏览(37)
  • 【Python】【pandas】DataFrame将包含日期值的列转换为日期时间格式或者日期格式

    上代码: 输出结果: 当执行上面的代码时,将执行以下步骤: 导入 pandas 库,以便使用其中的函数和方法。 创建一个名为 df 的DataFrame,其中包含一个名为 \\\'Date\\\' 的列。该列包含了不同的日期值,包括一个无效的日期值 \\\'Invalid Date\\\' 。 使用 pd.to_datetime 函数将 \\\'Date\\\' 列转换为日

    2024年02月05日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包