Hive 如何通过在配置单元中保留数据中的毫秒数将UTC转换为CST时间戳
我有一个配置单元表,其中带有数据类型时间戳的数据是UTC格式的。我已在此表顶部创建了一个视图,用于使用夏令时将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
转换为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