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

Spark(Hive)夏令时无效时间转Timestamp的解决方案咨询

解决方案

针对夏令时导致的无效时段时间转换返回NULL的问题,可以通过判断转换结果,对无效时段的时间字符串做小时加1处理后重新转换来解决,无需修改数据源。

实现SQL示例

SELECT 
  CASE 
    -- 先尝试正常转换时间
    WHEN to_timestamp(dt_str, 'yyyyMMdd HHmmss') IS NULL 
    THEN 
      -- 若转换失败,将原时间的小时部分加1后重新拼接转换
      to_timestamp(
        concat(
          substr(dt_str, 1, 8),          -- 提取日期部分(yyyyMMdd)
          ' ', 
          lpad(cast(substr(dt_str, 10, 2) AS INT) + 1, 2, '0'),  -- 小时加1并补零为两位
          substr(dt_str, 12, 4)          -- 提取分钟秒部分(mmss)
        ), 
        'yyyyMMdd HHmmss'
      )
    ELSE to_timestamp(dt_str, 'yyyyMMdd HHmmss')
  END AS converted_timestamp
FROM (SELECT '20220327 021500' AS dt_str) t

逻辑说明

  1. 先调用to_timestamp尝试正常转换输入的时间字符串;
  2. 若转换结果为NULL(说明该时间在当前时区不存在),则拆分原字符串:
    • 截取前8位作为日期部分;
    • 截取第10-11位作为小时,转成整数后加1,再用lpad补零保证是两位格式;
    • 截取最后4位作为分钟秒部分;
  3. 将处理后的各部分重新拼接成合法的时间字符串,再次调用to_timestamp完成转换。

官方文档补充说明

Spark 3.1版本中,如果指定的日期时间格式无效,from_unixtime、unix_timestamp、to_unix_timestamp、to_timestamp和to_date函数会执行失败;而在Spark 3.0及更早版本中,这些函数会返回NULL。

内容的提问来源于stack exchange,提问作者Pablo López Gallego

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:24:47