我有一个配置单元表,其中带有时间戳记数据类型的数据为UTC格式。我在此表的顶部创建了一个视图,以将UTC
转换为CST
,并具有夏时制。这种转换工作正常。但是数据丢失了毫秒。
以下逻辑用于将UTC转换为CST
FROM_UTC_TIMESTAMP(UNIX_TIMESTAMP(added_date, 'yyyy-MM-dd HH:mm:ss.SSS') * 1000, 'CST6CDT')
请帮助我将UTC
转换为CST
,包括时间戳的毫秒数。
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