Hive 时间戳和日期相互转换

博客主要介绍了Hive中时间戳与日期的转换,包括时间戳转日期、日期转时间戳,以及yyyymmdd和yyyy - mm - dd日期格式的切换。给出了两种转换方法,还提醒要注意时间戳可能是毫秒级的,并说明了区分秒级和毫秒级时间戳的方法。

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

时间戳转成日期

select from_unixtime(1441565203,'yyyy/MM/dd HH:mm:ss') 

日期转成时间戳

select unix_timestamp('20111207 13:01:03') 
-- 默认格式为 "yyyy-MM-dd HH:mm:ss"   
-- 如果你想指定时间格式,写法如下
select unix_timestamp('2021-07-27 13:01:03','yyyy-MM-dd HH:mm:ss')

yyyymmdd和yyyy-mm-dd日期之间的切换

方法1: 先转成时间戳,再转成日期字符串,并格式化;from_unixtime + unix_timestamp

-- 20210727 转成 2021-07-27   
select from_unixtime(unix_timestamp('20210727','yyyymmdd'),'yyyy-mm-dd')
-- 2021-07-27 转成 20210727 
select from_unixtime(unix_timestamp('2021-07-27','yyyy-mm-dd'),'yyyymmdd')

方法2: substr + concat 操作字符串

-- 20210727 转成 2021-07-27    
select concat(substr('20210727',1,4),'-',substr('20210727',5,2),'-',substr('20210727',7,2))
-- 2021-07-27 转成 20210727 
select concat(substr('2021-07-27',1,4),substr('2021-07-27',5,2),substr('2021-07-27',7,2))

需要注意的是,时间戳有可能是毫秒级的,然后这时候直接使用from_unixtime(1441565203,‘yyyy/MM/dd HH:mm:ss’) 的话就会得到很奇怪的日期了,这时候要这样 from_unixtime(cast(151331629920/1000 as int)),同样的,时间转成毫秒级的时间戳也要乘以1000,如:unix_timestamp(‘2018-12-18 00:38:50’)*1000

如何区分时间戳是秒级还是毫秒级呢?一般来说,常见的时间戳是10位数的,13位数的时间戳就是毫秒级的

在这里插入图片描述

<think>我们有一个任务:将Hive中的时间戳转换日期格式。时间戳通常指的是从1970年1月1日00:00:00 UTC开始计算的秒数(或毫秒数)。在Hive中,我们通常使用内置函数进行转换。根据引用,我们可以使用`from_unixtime`函数将时间戳(秒数)转换为字符串格式的日期。该函数的第一个参数是时间戳(整数),第二个参数是目标日期格式(可选,默认为'yyyy-MM-dd HH:mm:ss')。例如,将时间戳(秒)转换为'yyyy-MM-dd'格式的日期: ```sqlselect from_unixtime(1609459200, 'yyyy-MM-dd');``` 这将返回:'2021-01-01'注意:如果时间戳是以毫秒为单位的,我们需要先将其转换为秒(除以1000),因为`from_unixtime`函数默认处理的是秒级时间戳。例如,对于毫秒级时间戳1609459200000,我们可以这样转换: ```sqlselect from_unixtime(cast(1609459200000as bigint)/1000, 'yyyy-MM-dd');``` 或者更简洁地:```sqlselectfrom_unixtime(1609459200000 div1000,'yyyy-MM-dd'); ```另外,如果我们的时间戳是字符串格式的,我们需要先将其转换为整数类型(比如bigint)再进行计算。例如: ```sqlselect from_unixtime(cast('1609459200'as bigint),'yyyy-MM-dd'); ```如果我们的时间戳列是浮点数,也可以直接使用,因为函数会将其转换为整数(截断小数部分)。另外,引用[1]中提到了将字符串日期格式从'yyyyMMdd'转换为'yyyy-MM-dd'的方法,这使用了`unix_timestamp``from_unixtime`的组合:```sqlselectfrom_unixtime(unix_timestamp('20211022','yyyyMMdd'),"yyyy-MM-dd"); ```这里,`unix_timestamp`函数将字符串日期(格式为'yyyyMMdd')转换时间戳(秒),然后`from_unixtime`函数将时间戳转换为目标格式的字符串。但是,如果我们的需求是直接将时间戳(数值类型)转换日期格式,那么直接使用`from_unixtime`即可。 总结步骤:1.确认时间戳的单位(秒还是毫秒)。如果是毫秒,需要先除以1000转换为秒。2.使用`from_unixtime`函数,指定目标日期格式。示例: -秒级时间戳日期(格式为'yyyy-MM-dd HH:mm:ss'):```sqlselect from_unixtime(1614556800);```结果:'2021-02-2800:00:00' -毫秒级时间戳日期(格式为'yyyy-MM-dd'):```sqlselectfrom_unixtime(1614556800000/1000, 'yyyy-MM-dd');```或```sqlselectfrom_unixtime(cast(1614556800000 asdouble)/1000, 'yyyy-MM-dd');```注意:Hive中整数除法会得到整数,所以如果毫秒时间戳是bigint类型,除以1000可能会被截断(整数除法)。为了避免这个问题,可以先将毫秒时间戳转换为double类型再除以1000,或者使用`div`运算符(整数除法)并确保没有小数部分。另外,如果目标格式是其他形式,比如'yyyy/MM/dd',只需修改第二个参数即可。例如:```sqlselectfrom_unixtime(1614556800, 'yyyy/MM/dd HH:mm:ss'); ```结果:'2021/02/2800:00:00'如果时间戳列是表中的一个字段,假设字段名为`timestamp_col`,则转换的SQL语句为:```sqlselectfrom_unixtime(timestamp_col, 'yyyy-MM-dd')as date_colfrom table_name;``` (如果是毫秒,则使用`timestamp_col/1000`)另外,Hive3.0及以上版本支持新的日期函数,比如`to_date`,但`to_date`只能返回日期部分(格式固定为'yyyy-MM-dd'),且输入必须是日期字符串或时间戳类型(timestamp)。如果我们的时间戳是整数类型,还是使用`from_unixtime`更直接。 如果我们需要转换Hive中的Date类型(而不是字符串),可以使用`to_date(from_unixtime(timestamp_col))`,这样会得到'yyyy-MM-dd'格式的Date类型。例如:```sqlselectto_date(from_unixtime(1614556800)) asmy_date;```但是,如果只需要字符串形式的日期,直接使用`from_unixtime`并指定格式即可。 因此,根据需求,我们选择合适的方法。</think>### Hive 时间戳日期格式方法 在 Hive 中,时间戳(Unix 时间戳)到日期格式的转换主要通过 `from_unixtime()` 函数实现。以下是详细步骤示例: #### 1. **基本转换方法** - **语法**:`from_unixtime(unix_timestamp, format)` - **功能**: - `unix_timestamp`:整数类型的时间戳(秒级) - `format`:目标日期格式(可选,默认为 `yyyy-MM-dd HH:mm:ss`) - **示例**: ```sql -- 将时间戳 1661990400 转为默认格式 SELECT from_unixtime(1661990400); -- 输出:2022-08-31 00:00:00 -- 指定目标格式为 yyyy-MM-dd SELECT from_unixtime(1661990400, 'yyyy-MM-dd'); -- 输出:2022-08-31 ``` #### 2. **处理毫秒级时间戳** 若时间戳为毫秒级(13位),需先转换为秒级: ```sql -- 毫秒级时间戳日期 SELECT from_unixtime(CAST(1661990400000 AS BIGINT) / 1000, 'yyyy-MM-dd'); -- 输出:2022-08-31 ``` #### 3. **字符串时间戳转换** 若时间戳以字符串形式存储,需先转为数值类型: ```sql -- 字符串时间戳日期 SELECT from_unixtime(CAST('1661990400' AS BIGINT), 'yyyy-MM-dd'); -- 输出:2022-08-31 ``` #### 4. **常用日期格式示例** | 目标格式 | Hive 语句示例 | 输出结果 | |----------------|----------------------------------------|------------------| | `yyyy-MM-dd` | `from_unixtime(1661990400, 'yyyy-MM-dd')` | 2022-08-31 | | `yyyy/MM/dd` | `from_unixtime(1661990400, 'yyyy/MM/dd')` | 2022/08/31 | | `yyyy年MM月dd日` | `from_unixtime(1661990400, 'yyyy年MM月dd日')` | 2022年08月31日 | | `HH:mm:ss` | `from_unixtime(1661990400, 'HH:mm:ss')` | 00:00:00 | #### 5. **复杂场景:日期格式互转** 若需将其他格式的日期字符串(如 `yyyyMMdd`)转为标准日期格式,可结合 `unix_timestamp()`: ```sql -- 将 '20220831' (yyyyMMdd) 转为 'yyyy-MM-dd' SELECT from_unixtime( unix_timestamp('20220831', 'yyyyMMdd'), -- 先转时间戳 'yyyy-MM-dd' -- 再转目标格式 ); -- 输出:2022-08-31 [^1] ``` #### 注意事项 - **时区问题**:Hive 默认使用 UTC 时区,如需本地时区需配置 `hive.session.timezone`。 - **空值处理**:非法时间戳或格式错误会返回 `NULL`。 - **性能优化**:对大规模数据避免逐行转换,优先用数值计算。 > 引用说明: > [^1]: 日期格式转换示例参考 Hive 标准方法。 > [^2]: 时间戳处理需注意输入格式匹配性。 > [^3]: 复杂日期转换需分步处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值