Hive 3.1.3 毫秒时间戳转带毫秒字符串格式异常如何修复
Hive 3.1.3 毫秒级时间戳转字符串保留毫秒解决方案
错误原因
你写的代码存在3个核心逻辑问题:
unix_timestamp()函数返回的是秒级整数时间戳,执行时已经丢弃了current_timestamp的毫秒部分- 提取出的毫秒字符串直接加在秒级时间戳上,相当于错误将原时间向后偏移了几百到上千秒
- Hive 3.x版本的
from_unixtime()入参仅支持秒级时间戳,格式符中的SSS不会自动识别填充毫秒值,默认会固定输出000,和你传入的参数无关
正确实现方案
方案1:直接处理current_timestamp场景
拆分时间字符串的日期时间部分和毫秒部分后拼接,性能最高:
select concat( date_format(current_timestamp, 'yyyy-MM-dd HH:mm:ss'), '.', regexp_extract(string(current_timestamp), '\\.(\\d{3})', 1) ) as date_formatted_ms;
方案2:处理13位数值型毫秒时间戳场景
如果你的源数据是bigint类型的13位毫秒时间戳,使用以下逻辑:
select concat( from_unixtime(floor(ms_timestamp / 1000), 'yyyy-MM-dd HH:mm:ss'), '.', lpad(ms_timestamp % 1000, 3, '0') ) as date_formatted_ms from your_table;
两种方案输出的格式均为yyyy-MM-dd HH:mm:ss.SSS,毫秒部分会正确保留三位有效数值。
内容的提问来源于stack exchange,提问作者codecraker
相关产品推荐
相关产品推荐

