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

Databricks SQL执行to_date时触发PARSE_DATETIME_BY_NEW_PARSER错误

解决Spark 3.0+中Databricks日期解析PARSE_DATETIME_BY_NEW_PARSER错误

错误原因

你的ORDERDATE列存在两种日期格式的字符串:一种是带时间的M/dd/yyyy H:mm(如10/10/2003 0:00),另一种是不带时间的M/d/yyyy(如错误提示里的5/7/2003)。Spark 3.0+默认启用的CORRECTED日期解析器对格式匹配要求严格,当字符串格式与指定的M/dd/yyyy H:mm完全不符时(比如缺失时间部分),就会触发解析错误。而单个带时间的字符串能正常解析,是因为它完全匹配指定格式。

解决方案

方法1:切换到LEGACY解析模式

临时设置会话参数,恢复Spark 3.0之前的宽松解析行为,兼容格式不严格的日期字符串:

SET spark.sql.legacy.timeParserPolicy = LEGACY;

-- 之后执行你的查询
SELECT to_date(ORDERDATE, 'M/dd/yyyy H:mm') FROM sales_kaggle_chart LIMIT 10;

这种方式快速有效,但长期来看,建议使用更规范的格式处理逻辑,避免依赖旧行为。

方法2:兼容多种日期格式解析

用coalesce函数依次尝试多种可能的格式,直到找到能解析的格式:

SELECT 
  coalesce(
    to_date(ORDERDATE, 'M/dd/yyyy H:mm'),
    to_date(ORDERDATE, 'M/d/yyyy'),
    to_date(ORDERDATE, 'MM/d/yyyy') -- 可选,覆盖更多潜在格式
  ) AS order_date
FROM sales_kaggle_chart 
LIMIT 10;

coalesce会返回第一个解析成功的结果,完美适配列中格式不统一的情况。

方法3:统一清洗日期字符串

先将所有日期字符串标准化为同一种格式,再进行解析:

SELECT 
  to_date(
    -- 给不带时间的字符串补全默认时间
    CASE 
      WHEN instr(ORDERDATE, ' ') = 0 THEN concat(ORDERDATE, ' 0:00')
      ELSE ORDERDATE 
    END, 
    'M/dd/yyyy H:mm'
  ) AS order_date
FROM sales_kaggle_chart 
LIMIT 10;

这种方式从根源上统一数据格式,适合长期维护的数据集。

内容的提问来源于stack exchange,提问作者Bharathan Kumaran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:45:24