Функция 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