You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:45:07