在 where 子句中将字符串更改为日期时间格式以进行比较

Posted

技术标签:

【中文标题】在 where 子句中将字符串更改为日期时间格式以进行比较【英文标题】:Changing a string to datetime format in where clause for comparison 【发布时间】:2016-12-21 16:34:56 【问题描述】:

我有一个如下所示的数据集:

datetime                                 count        
18:28:20.602 UTC DEC 08 2016                1
20:42:32.017 UTC DEC 08 2016                5
15:33:40.691 UTC DEC 08 2016                1
17:11:54.008 UTC DEC 08 2016                3
20:28:57.861 UTC DEC 08 2016                0
.
.
.
.

日期时间列是字符串格式。我很难将其转换为时间戳

如何编写 Impala/Hive 查询,以便获取“18:28:00.000 UTC 2016 年 12 月 8 日”到“18:33:00.000 UTC 2016 年 12 月 8 日”之间的数据

【问题讨论】:

【参考方案1】:

使用 Hive:

cast(from_unixtime(unix_timestamp(SHITTY_FORMAT, 'HH:mm:ss.SSS zzz MMM dd yyyy'), 'yyyy-MM-dd HH:mm:ss.SSS') as Timestamp)

...会将您的糟糕字符串格式转换为 UNIX 时间戳,然后转换为字符串标准格式(在本地时区,因为这是 Hive 约定),然后转换为时间戳。 不幸的是,没有更简单的方法。 由于夏季/冬季 1 小时的重叠,您可能会遇到一些极端情况

来源:Hive documentation,当然……


使用 Impala (不支持 zzz 格式修饰符)
cast(from_unixtime(unix_timestamp(regexp_replace(SHITTY_FORMAT, ' UTC ', ' '), 'HH:mm:ss.SSS MMM dd yyyy'), 'yyyy-MM-dd HH:mm:ss.SSS') as Timestamp) 

...会将你糟糕的字符串格式转换成 UNIX 时间戳,假设你所有的输入都是 UTC,然后转换成字符串标准格式(在 UTC 时区,因为这是 Impala 约定),然后是时间戳。

【讨论】:

以上是关于在 where 子句中将字符串更改为日期时间格式以进行比较的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Amazon Redshift 中将列从字符串更改为日期?

如何在tableview中将JSON字符串更改为日期格式

在 kibana-7.1.1 中将日期格式从纪元更改为日期

Laravel 在 where 子句中更改日期格式以匹配 Carbon::now()

想在AngularJS中将格式从日期时间更改为日期

在php中将日期格式更改为数字[重复]