将具有 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 中的日期列
无法使用 Keras 和 Sklearn 将字符串列转换为分类矩阵
如何将日期/时间从 24 小时格式转换为 12 小时 AM/PM? [复制]