使用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
相关产品推荐
相关产品推荐

