unix_timestamp 时间戳函数用法(hive)

本文详细介绍了Hive中时间戳与日期的转换方法,包括unix_timestamp、from_unixtime及to_utc_timestamp函数的使用技巧,同时展示了如何处理毫秒级时间戳。

一、unix_timestamp函数用法 
1、unix_timestamp() 得到当前时间戳 
2、如果参数date满足yyyy-MM-dd HH:mm:ss形式,则可以直接unix_timestamp(string date) 得到参数对应的时间戳 
3、如果参数date不满足yyyy-MM-dd HH:mm:ss形式,则我们需要指定date的形式,在进行转换 

select unix_timestamp('2009-03-20')   --1237507200
select unix_timestamp('2009-03-20 00:00:00', 'yyyy-MM-dd HH:mm:ss') --1237507200
select unix_timestamp('2009-03-20 00:00:01', 'yyyy-MM-dd HH:mm:ss') --1237507201

 

二、from_unixtime函数用法 
语法:from_unixtime(t1,’yyyy-MM-dd HH:mm:ss’) 
其中t1是10位的时间戳值,即1970-1-1至今的秒,而13位的所谓毫秒的是不可以的。 
对于13位时间戳,需要截取,然后转换成bigint类型,因为from_unixtime类第一个参数只接受bigint类型。例如: 

select from_unixtime(1237507201,'yyyy-MM-dd HH:mm:ss') -- 2009-03-20 00:00:01
select from_unixtime(1237507200,'yyyy-MM-dd HH:mm:ss') -- 2009-03-20 00:00:00

常用的插入时间为当前系统时间 转换成距离1970的时间戳,再转换成当前时间

select FROM_UNIXTIME(UNIX_TIMESTAMP() ,'yyyy-MM-dd HH:mm:ss') AS W_INSERT_DT

总结

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

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

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

三  LAST_DAY 函数的用法

last_day 用impala不可以,用hive可以,获取本月月末

SELECT LAST_DAY(CONCAT('${START_DATE}','-01'))  
--传入2019-02  得到 2019-02-28
--传入2019-02-01  得到 2019-02-28

 

 

Hive中TimeStamp获取及转换

1.Hive中使用current_timestamp()函数获取当前时间

select current_timestamp();   --2019-07-04 10:17:08.429275000

使用Hive的current_timestamp()函数获取到当前的时间精确到毫秒。

2.Hive中获取当前时间戳,默认使用unix_timestamp()函数

select unix_timestamp(current_timestamp());   --1562235446

使用Hive的unix_timestamp()函数获取到当前的时间戳为10位的bigint类型数值,该数值只精确到秒级别。

3.Hive中将时间戳转换为日期类型,默认使用from_unixtime ()

select from_unixtime(1543735779, 'yyyy-MM-dd HH:mm:ss:SSS');
--2019-07-04 10:17:26:000

上面的转换结果可以看到时间的毫秒是无法正常获取到,因为时间戳只是精确到秒级别的,from_unixtime()函数也只支持秒级别的时间戳转换。

4.Hive中获取毫秒级别的时间戳

select current_timestamp(),
cast(current_timestamp() as double) as 'timestamp';


current_timestamp()	timestamp
 	current_timestamp()          	timestamp
1	2019-07-04 10:20:34.743662000	1562235634.7436621


这里可以看到获取到了一个13位的数值,该数值精确到毫秒即为当前的时间的时间戳。

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

select to_utc_timestamp(1543736635303, 'GMT');

--2018-12-02 15:43:55.303    --用impala不行

使用Hive提供的to_utc_timestamp()函数将毫秒级别的时间戳转换为相应的时间并且精确到了毫秒,与上一步获取时间戳的时间一致。

select from_unixtime(cast(substring(tistmp,1,10) as bigint),’yyyy-MM-dd HH’) tim ,count(*) cn from hour_data where …

### Unix 时间戳的定义 Unix 时间戳Unix timestamp),或称 Unix 时间(Unix time)、POSIX 时间(POSIX time),是一种时间表示方式,定义为从格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒起至现在的总秒数。这一时间表示方式不考虑闰秒,通常以秒为单位进行计算[^1]。 ### Unix 时间戳的用途 Unix 时间戳被广泛用于 Unix 系统、类 Unix 系统以及其他许多操作系统中。其主要用途包括: - **时间计算**:便于进行时间的加减、比较等操作。 - **日志记录**:系统日志中常用时间戳记录事件发生的时间。 - **跨时区处理**:由于时间戳基于 UTC 时间,因此在处理多时区问题时更加方便[^1]。 ### Unix 时间戳的使用方法 #### 获取当前 Unix 时间戳 在不同的编程语言中,获取 Unix 时间戳的方式有所不同: - **JavaScript**:可以通过 `Math.round(new Date().getTime() / 1000)` 获取当前时间戳(单位为秒)。 - **Python**:可以使用 `import time` 模块中的 `time.time()` 函数获取当前时间戳。 - **C语言**:可以使用 `time.h` 头文件中的 `time_t time(time_t *timer)` 函数获取当前时间戳。 #### 将 Unix 时间戳转换为可读时间格式 在实际应用中,通常需要将时间戳转换为人类可读的时间格式。例如: - **JavaScript**:可以使用 `new Date(timestamp * 1000)` 将时间戳转换为日期对象,再通过 `.toLocaleString()` 等方法格式化输出。 - **Python**:可以使用 `time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timestamp))` 将时间戳转换为格式化字符串。 - **C语言**:可以使用 `localtime()` 或 `gmtime()` 函数时间戳转换为 `tm` 结构体,再通过 `asctime()` 或 `strftime()` 函数格式化输出[^3]。 #### 示例代码 ##### JavaScript 获取 Unix 时间戳 ```javascript var unixTimestamp = Math.round(new Date().getTime() / 1000); console.log("当前 Unix 时间戳:" + unixTimestamp); ``` ##### Python 获取 Unix 时间戳 ```python import time unix_timestamp = int(time.time()) print(f"当前 Unix 时间戳:{unix_timestamp}") ``` ##### C语言 获取 Unix 时间戳 ```c #include <stdio.h> #include <time.h> int main() { time_t current_time; time(&current_time); // 获取当前时间戳 printf("当前 Unix 时间戳:%ld\n", current_time); return 0; } ``` ### 时间戳转换为可读时间格式的示例 #### JavaScript 将时间戳转换为日期 ```javascript var timestamp = 1630425600; // 2021-09-01 00:00:00 UTC var date = new Date(timestamp * 1000); console.log(date.toLocaleString()); // 输出本地时间格式 ``` #### Python 将时间戳转换为日期 ```python import time timestamp = 1630425600 # 2021-09-01 00:00:00 UTC formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timestamp)) print(f"格式化后的时间:{formatted_time}") ``` #### C语言 将时间戳转换为日期 ```c #include <stdio.h> #include <time.h> int main() { time_t timestamp = 1630425600; // 2021-09-01 00:00:00 UTC struct tm *local_time = localtime(&timestamp); char buffer[80]; strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time); printf("格式化后的时间:%s\n", buffer); return 0; } ``` ###
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值