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

Databricks中Y2K日期值格式化问题咨询

Databricks中Y2K日期值格式化问题咨询

你好呀,我来帮你理清这个日期解析的问题~

你遇到的情况是典型的Y2K两位年份解析问题:Spark SQL(Databricks基于Spark)默认处理两位年份yy格式时,会把00-69的年份值解析为2000-2069年,70-99则解析为1970-1999年,所以01-Jan-01里的01就被自动归到2001年了,这就是为什么结果不符合预期。

针对这个问题,给你两个实用的解决办法:

方法一:自定义逻辑调整年份(推荐,更灵活可控)

通过CASE WHEN判断解析后的日期,如果年份超出你的业务预期范围(比如大于2050年),就减去100年修正:

SELECT 
  '01-Jan-01' AS badDate,
  -- 先解析日期,再判断是否需要减100年
  CASE 
    WHEN to_date('01-Jan-01', 'dd-MMM-yy') > date_add(current_date(), 365*50) -- 假设业务中不会有超过50年后的日期
    THEN add_months(to_date('01-Jan-01', 'dd-MMM-yy'), -1200) -- 1200个月=100年,比直接减天数更准确(兼容闰年)
    ELSE to_date('01-Jan-01', 'dd-MMM-yy')
  END AS corrected_date

如果你的业务明确所有两位年份都是19xx年,也可以直接写死修正:

SELECT 
  '01-Jan-01' AS badDate,
  add_months(to_date('01-Jan-01', 'dd-MMM-yy'), -1200) AS corrected_date

方法二:修改Spark会话的日期解析规则

如果希望全局统一调整两位年份的解析逻辑,可以设置Spark的会话参数,指定默认的世纪起始年份。比如在Databricks notebook中先运行:

-- 设置两位年份默认解析为1900-1999年
SET spark.sql.datetime.parser.defaultCenturyStart=1900;

之后再运行你的原查询,to_date('01-Jan-01','dd-MMM-yy')就会返回1901-01-01了。不过这个设置会影响整个会话的日期解析,需要根据实际业务场景评估是否适用。

另外补充一下你原查询里的小细节:date_format函数的第一个参数如果是字符串,会先自动转成日期再格式化,所以它的行为和to_date是一致的,也会受同样的解析规则影响。

备注:内容来源于stack exchange,提问作者Jamie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 14:42:35