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

使用Python oracledb读取Oracle日期列遇年份超出范围错误求助

问题分析
  • 错误根源:Oracle的DATE类型支持公元前4712年(儒略日历起始日期),但Python标准库的datetime.datetime仅支持公元1年及以后的日期。当oracledb尝试将数据库中的公元前日期转换为Python datetime对象时,内部解析逻辑出现溢出异常,导致抛出year 60824 is out of range错误。
  • 第三方工具(如DBViewer)能正常显示,是因为这类工具直接将日期以字符串形式处理,没有强制转换为Python的datetime对象。
解决方案

以下是无需修改数据库即可解决的几种方案:

方案1:查询时直接将日期转为字符串

在SQL语句中使用TO_CHAR函数把日期列转换为字符串,绕过oracledb的日期解析逻辑:

cursor.execute("select TO_CHAR(T$RGDT, 'YYYY-MM-DD HH24:MI:SS.FF3') from T_ERPLNFP3.TBPTMM111100")

读取到的结果为字符串格式,可根据需求自行处理(如保留字符串,或做特殊判断后转换为datetime对象)。

方案2:修改输出类型处理器,跳过datetime转换

调整OutputHandler函数,遇到DB_TYPE_DATE类型时直接返回字符串变量,避免转换为datetime:

def OutputHandler(cursor, name, defaulttype, length, precision, scale):
    if defaulttype == oracledb.DB_TYPE_DATE:
        # 将日期以指定格式的字符串读取
        return cursor.var(oracledb.DB_TYPE_VARCHAR, arraysize=cursor.arraysize, 
                          outconverter=lambda val: val.strftime('%Y-%m-%d %H:%M:%S.%f')[:23] if val is not None else None)
    # 其他类型保持默认处理逻辑
    return None

方案3:切换到oracledb厚模式(依赖Oracle Client)

如果环境允许安装Oracle Client,切换到厚模式可提升旧日期的兼容性:

import oracledb
oracledb.init_oracle_client()  # 初始化厚模式
# 后续连接、查询代码保持不变
验证说明

修改代码后执行查询,可正常获取4712-01-01 00:00:00.000格式的日期数据,不再抛出年份范围错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:52:51