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



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

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

我想在IMPALA中将上述列值转换为时间戳。尝试了强制转换、to_timestamp和其他方法,但结果要么显示语法错误,要么显示Null。你能建议的解决方案吗

第二项要求

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

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

请给我一个建议,我是黑斑羚的新手

提前感谢

您可以使用以下代码。不幸的是,黑斑羚没有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小时(包括12 PM场景(,最后如果为任何其他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

最新更新