如何通过在Hive中保留数据中的毫秒数将UTC转换为CST时间戳

问题描述 投票:1回答:1

我有一个配置单元表,其中带有时间戳记数据类型的数据为UTC格式。我在此表的顶部创建了一个视图,以将UTC转换为CST,并具有夏时制。这种转换工作正常。但是数据丢失了毫秒。

以下逻辑用于将UTC转换为CST

FROM_UTC_TIMESTAMP(UNIX_TIMESTAMP(added_date, 'yyyy-MM-dd HH:mm:ss.SSS') * 1000, 'CST6CDT')

请帮助我将UTC转换为CST,包括时间戳的毫秒数。

hive timestamp hiveql unix-timestamp milliseconds
1个回答
0
投票

unix_timestamp()函数将忽略毫秒。它返回从unix纪元过去的秒数。毫秒丢失。例如:

 select FROM_UTC_TIMESTAMP(UNIX_TIMESTAMP('2020-01-21 15:15:35.125', 'yyyy-MM-dd HH:mm:ss.SSS') * 1000, 'CST6CDT');

返回:

2020-01-21 09:15:35

如果时间戳采用正确的格式(并且在您的示例中,根据模板,它不需要转换),则可以正常工作:

with s as (select '2020-01-21 15:15:35.125' as added_date) 

select FROM_UTC_TIMESTAMP(s.added_date, 'CST6CDT')  from s;

结果:

2020-01-21 09:15:35.125

如果时间戳是需要转换的格式,解决方法是从原始时间戳中提取毫秒,并将unix_timestamp乘以1000后得到的毫秒数相加:

with s as (select '2020-01-21 15:15:35.125' as added_date) 

select FROM_UTC_TIMESTAMP(UNIX_TIMESTAMP(s.added_date, 'yyyy-MM-dd HH:mm:ss.SSS') * 1000+cast(split(added_date,'\\.')[1] as int), 'CST6CDT')  from s;

结果:

2020-01-21 09:15:35.125

另一个解决方法以毫秒为单位进行连接:

with s as (select '2020-01-21 15:15:35.125' as added_date) 

select concat_ws('.',cast(FROM_UTC_TIMESTAMP(UNIX_TIMESTAMP(s.added_date, 'yyyy-MM-dd HH:mm:ss.SSS') * 1000, 'CST6CDT') as string),split(added_date,'\\.')[1]) from s;

结果:

2020-01-21 09:15:35.125
© www.soinside.com 2019 - 2024. All rights reserved.