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

Hive 如何通过在配置单元中保留数据中的毫秒数将UTC转换为CST时间戳,hive,timestamp,hiveql,unix-timestamp,milliseconds,Hive,Timestamp,Hiveql,Unix Timestamp,Milliseconds,我有一个配置单元表,其中带有数据类型时间戳的数据是UTC格式的。我已在此表顶部创建了一个视图,用于使用夏令时将UTC转换为CST。这种转换很有效。但数据中缺少毫秒 以下逻辑用于将UTC转换为CST FROM_UTC_TIMESTAMP(UNIX_TIMESTAMP(added_date, 'yyyy-MM-dd HH:mm:ss.SSS') * 1000, 'CST6CDT') 请帮助我将UTC转换为CST,包括时间戳中的毫秒。unix\u timestamp()函数忽略毫秒。它返回从unix

我有一个配置单元表,其中带有数据类型时间戳的数据是UTC格式的。我已在此表顶部创建了一个视图,用于使用夏令时将
UTC
转换为
CST
。这种转换很有效。但数据中缺少毫秒

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

FROM_UTC_TIMESTAMP(UNIX_TIMESTAMP(added_date, 'yyyy-MM-dd HH:mm:ss.SSS') * 1000, 'CST6CDT')
请帮助我将
UTC
转换为
CST
,包括时间戳中的毫秒。

unix\u 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
如果时间戳采用正确的格式“yyyy-MM-dd HH:MM:ss.SSS”(在您的示例中,根据模板,它不需要转换),则可以正常工作:

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
2020-01-21 09:15:35.125
如果时间戳的格式需要转换,解决方法是从原始时间戳中提取毫秒,并将unix_时间戳乘以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
unix\u 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
如果时间戳采用正确的格式“yyyy-MM-dd HH:MM:ss.SSS”(在您的示例中,根据模板,它不需要转换),则可以正常工作:

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
2020-01-21 09:15:35.125
如果时间戳的格式需要转换,解决方法是从原始时间戳中提取毫秒,并将unix_时间戳乘以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