如何在进行选择查询时将 YYYY-MM-DD HH:mm:ss 中的时间戳转换为 Hive 中的 YYYY-MM-DD HH:mm:ss.SSS?

Posted

技术标签:

【中文标题】如何在进行选择查询时将 YYYY-MM-DD HH:mm:ss 中的时间戳转换为 Hive 中的 YYYY-MM-DD HH:mm:ss.SSS?【英文标题】:How to I convert Timestamp in YYY-MM-DD HH:mm:ss to YYY-MM-DD HH:mm:ss.SSS in Hive while doing a select query? 【发布时间】:2019-12-30 08:58:29 【问题描述】:

我正在比较 2 个不同数据库引擎之间的时间戳列,当没有条目时,我需要将存储在 YYY-MM-DD HH:mm:ss 格式的时间戳列检索为 YYY-MM-DD HH:mm:ss.SSS,,其中 SSS000

我可以使用 Hive 选择查询来执行上述操作吗?

【问题讨论】:

【参考方案1】:

拆分时间戳以获得毫秒部分,如果根本没有毫秒部分或毫秒部分小于 3 位,则使用 rpad 添加零。

演示:

 with your_data as (
    select stack(3, '2019-11-02 20:18:00.123',
                    '2019-11-02 20:18:00.12',
                    '2019-11-02 20:18:00'
                ) as ts
    )

 select concat(split(ts,'\\.')[0],'.',rpad(nvl(split(ts,'\\.')[1],''),3,0))
   from your_data d 
 ;

结果:

2019-11-02 20:18:00.123
2019-11-02 20:18:00.120
2019-11-02 20:18:00.000

【讨论】:

如果点后面可能有一些东西,这会更强大,但假设它是全部或全部,一个更简单的解决方案也应该足够了。【参考方案2】:

鉴于这两种格式(及其长度)都是严格定义的,您可以使用这个简单的逻辑:

left(concat(ts,'.000'),19)

无法检查确切的语法,但基本上你会附加额外的零并在不需要时将它们切断。

【讨论】:

以上是关于如何在进行选择查询时将 YYYY-MM-DD HH:mm:ss 中的时间戳转换为 Hive 中的 YYYY-MM-DD HH:mm:ss.SSS?的主要内容,如果未能解决你的问题,请参考以下文章

如何从日期格式“yyyy-MM-dd'T'HH:mm:ss.SSSZ”中分别获取日期、年份、小时、分钟?

JS中如何将yyyy-MM-dd HH:mm:ss格式的字符串转成Date类型

如何在linq中设置日期格式“yyyy-MM-dd hh:mm”?

如何在 Java 中以 YYYY-MM-DD HH:MI:Sec.Millisecond 格式获取当前时间?

如何睡到特定时间 YYYY-MM-DD HH:MM:SS?

JS 如何将 yyyy-MM-dd HH:mm:ss字符串 转换成yyyy-MM-dd字符串