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

13z8s7eq  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(743)

我有一个配置单元表,其中带有数据类型timestamp的数据是utc格式的。我在这个表的顶部创建了一个视图来转换 UTCCST 用夏时制。这种转换很有效。但是数据丢失了毫秒。
以下逻辑用于将utc转换为cst

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

请帮我转换一下 UTCCST 包括时间戳中的毫秒。

ars1skjm

ars1skjm1#

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

如果时间戳的格式需要转换,解决方法是从原始时间戳中提取毫秒,并将unix\u 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

相关问题