Impala将12小时制带AM/PM的时间字符串转为timestamp的方案问询
12小时制时间字符串转Impala timestamp解决方案
核心实现无需修改原Hive表,也不需要在Hive侧新建中间表/视图,直接基于原表在Impala侧创建视图即可,所有逻辑使用Impala通用基础函数,无版本兼容问题。
注意边界场景
转换前先明确12小时制的特殊规则,避免转换错误:
- 12:xx AM 对应24小时制的00:xx
- 12:xx PM 对应24小时制的12:xx,无需加12
视图创建示例
假设原Hive表中12小时制时间字段为time_str_12h,格式为yyyy-MM-dd hh:mm:ss a(示例值:2024-05-20 02:30:00 PM),建视图语句如下:
CREATE VIEW impala_24h_time_view AS SELECT -- 原表其他字段直接透传 *, to_timestamp( concat( -- 提取日期部分 split_part(time_str_12h, ' ', 1), ' ', -- 转换小时为24小时制 lpad( CASE -- PM且小时不为12时加12 WHEN UPPER(split_part(time_str_12h, ' ', 3)) = 'PM' AND CAST(SUBSTRING(split_part(time_str_12h, ' ', 2), 1, 2) AS INT) != 12 THEN CAST(SUBSTRING(split_part(time_str_12h, ' ', 2), 1, 2) AS INT) + 12 -- AM且小时为12时改为0 WHEN UPPER(split_part(time_str_12h, ' ', 3)) = 'AM' AND CAST(SUBSTRING(split_part(time_str_12h, ' ', 2), 1, 2) AS INT) = 12 THEN 0 -- 其余情况小时不变 ELSE CAST(SUBSTRING(split_part(time_str_12h, ' ', 2), 1, 2) AS INT) END, 2, '0' ), -- 提取时分秒中除小时的剩余部分 SUBSTRING(split_part(time_str_12h, ' ', 2), 3) ), 'yyyy-MM-dd HH:mm:ss' -- 此处替换为你实际的日期格式,如为月/日/年则改为`MM/dd/yyyy HH:mm:ss` ) AS time_24h_timestamp FROM 你的原Hive表名称;
适配说明
如果你的12小时制字符串格式与示例不同,只需调整三个部分即可:
- 调整
split_part的分隔符,适配你的时间字符串拆分规则 - 调整
SUBSTRING的截取位置,正确提取小时和剩余时分部分 - 修改
to_timestamp的格式模板,匹配你的日期部分格式
内容的提问来源于stack exchange,提问作者Lucid
相关产品推荐
相关产品推荐

