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

PostgreSQL两位年格式字符串日期转DATE提取年份异常如何解决

PostgreSQL两位年份日期转换偏移问题解决方案

问题根因

PostgreSQL 使用YY格式掩码解析两位年份时,默认遵循70年分界规则:00~69区间的两位年份会被识别为20002069年,`70~99`区间会被识别为19701999年。你遇到的10/1/58被识别为2058年就是这个规则导致的。

解决方案

方案1:动态修正年份(通用场景,优先选择)

如果你的数据同时包含20世纪和21世纪的日期,可以通过逻辑判断自动修正偏移的年份:

-- 修正后的年份提取逻辑
EXTRACT(YEAR FROM (
  CASE
    WHEN TO_DATE(release_date, 'MM/DD/YY') > CURRENT_DATE
    THEN TO_DATE(release_date, 'MM/DD/YY') - INTERVAL '100 years'
    ELSE TO_DATE(release_date, 'MM/DD/YY')
  END
)) AS release_year

对应的近10年筛选条件可以简化为:

WHERE
  (CASE
    WHEN TO_DATE(release_date, 'MM/DD/YY') > CURRENT_DATE
    THEN TO_DATE(release_date, 'MM/DD/YY') - INTERVAL '100 years'
    ELSE TO_DATE(release_date, 'MM/DD/YY')
  END) >= CURRENT_DATE - INTERVAL '10 years'

方案2:强制指定世纪(仅适用于所有日期均为19xx年的场景)

如果确认业务中所有release_date都属于1900-1999年,可以直接修改格式掩码强制指定世纪前缀,性能更高:

EXTRACT(YEAR FROM TO_DATE(release_date, 'MM/DD/19YY'))

方案3:底层数据治理(根治方案)

有条件的话建议直接将日期存储格式统一改为带4位年份的YYYY-MM-DD格式,或者直接将字段类型修改为DATE,从根源上消除两位年份的解析歧义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:45:01