hive - 如何通过在 Hive 中保留数据中的毫秒数将 UTC 转换为 CST 时间戳
问题描述
我有一个配置单元表,其中数据类型时间戳的数据采用 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
如果时间戳采用正确的格式 '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_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
推荐阅读
- c# - 在c#中表示路由(一个地方到下一个地方到下一个地方等等)的最佳方式是什么
- angular - 升级到 Angular 7 后无法生成 *.bundle.js 文件
- asp.net - SelectList values determined by previous SelectList Values
- ios - 为什么会导致保留循环?
- javascript - 如何获得滚动和覆盖效果?
- javascript - 连接的输入范围
- amadeus - 具有正确 API_KEY 和 API_SECRET 的 Amadeus 凭证使我的应用程序崩溃
- algorithm - 动态编程 Spoj 证明 LISA
- reactjs - 无论里面有什么组件,如何屏蔽/禁用整个页面
- php - PHP 和活动目录