【问题标题】:Convert String column which has AM/PM to Timestamp in Impala将具有 AM/PM 的字符串列转换为 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 的新手

提前致谢

【问题讨论】:

    标签: hive casting timestamp unix-timestamp 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
    • 更新了我的答案。
    猜你喜欢
    • 2021-12-29
    • 2018-06-12
    • 2021-09-12
    • 1970-01-01
    • 2017-01-16
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多