将具有 AM/PM 的字符串列转换为 Impala 中的时间戳

Posted

技术标签:

【中文标题】将具有 AM/PM 的字符串列转换为 Impala 中的时间戳【英文标题】:Convert String column which has AM/PM to Timestamp in Impala 【发布时间】:2021-12-31 19:10:13 【问题描述】:

我有一列具有字符串类型的值,如下所示:

31-Oct-2016 12:00 AM
31-May-2015 12:00 PM

我想将上述列值转换为 IMPALA 中的时间戳。尝试使用 cast、to_timestamp 和其他方式,但它要么显示语法错误,要么显示 Null 作为结果。 你能建议一个解决方案吗

第二个要求

字符串中有一个如下所示的列,我希望它单独转换为时间戳。

31-Oct-2016 12:00 
31-May-2015 12:00 

请提出一种方法,我是 Impala 的新手

提前致谢

【问题讨论】:

【参考方案1】:

您可以使用以下代码。不幸的是,impala 没有 am pm 转换功能,但您可以使用一些代码来识别 PM,并在此基础上增加 12 小时以正确转换。

select 
if (right('31-Oct-2016 02:09 PM',2)='PM',
to_timestamp('31-Oct-2016 02:09 PM','d-MMM-yyyy H:m') + interval 12 hours,
to_timestamp('31-Oct-2016 02:09 PM','d-MMM-yyyy H:m')
) ampm_timestamp

第二个要求 - Impala 在转换日期时间时总是需要 24 小时格式。因此,在您的情况下,对于上午 12 点的场景,我们必须执行一些特殊的逻辑,如下所示。 首先检查它是否是 12 AM,然后是负 12 小时,否则检查它是否是 PM,然后添加 12 小时(涵盖 12PM 场景),最后如果是任何其他 AM,它只是转换为时间戳。

select 
CASE WHEN right('31-Oct-2016 12:09 AM',2)='AM' AND RIGHT( SPLIT_PART('31-Oct-2016 12:09 AM',':',1),2)='12'
THEN to_timestamp('31-Oct-2016 12:09 AM','d-MMM-yyyy HH:mm') - interval 12 HOURS 
ELSE CASE WHEN  right('31-Oct-2016 12:09 AM',2)='PM'
THEN to_timestamp('31-Oct-2016 12:09 AM','d-MMM-yyyy HH:mm') + interval 12 HOURS 
ELSE to_timestamp('31-Oct-2016 12:09 AM','d-MMM-yyyy HH:mm') 
END END AMPM_TIMESTAMP

【讨论】:

感谢您的上述回答,但我正在寻找我在要求中提供的确切时间,例如上午 12:00 或下午 12:00,@Koushik Roy 更新了我的答案。

以上是关于将具有 AM/PM 的字符串列转换为 Impala 中的时间戳的主要内容,如果未能解决你的问题,请参考以下文章

将具有日期和纪元格式值的字符串列转换为 postgresql/Tableau prep 中的日期列

将字符串解析为日期时间,同时在熊猫中考虑 AM/PM

无法使用 Keras 和 Sklearn 将字符串列转换为分类矩阵

如何将日期/时间从 24 小时格式转换为 12 小时 AM/PM? [复制]

将 mysql TIME 从 24 HR 转换为 AM/PM 格式

将 Time DataType 转换为 AM PM 格式: