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

使用Pandas read_sql_query传入日期参数遇ORA-01843错误排查

ORA-01843错误排查:Pandas绑定Oracle日期参数失败

你尝试在Pandas的SQL查询中添加日期参数,SQL语句如下:

trades = """
Select
trade_date,
units
from
transactions
where
trade_date BETWEEN :startdate and :enddate
"""

对应的Python代码:

today = pd.Timestamp.today().strftime('%-m/%-d/%Y')
yday = date.today() - timedelta(days=1)
yday = yday.strftime('%-m/%-d/%Y')

trades_df = pd.read_sql_query(trades, con, params = {"startdate":today, "enddate":yday})

执行时触发ORA-01843: not a valid month错误,问题原因及解决方法如下:

问题原因

你将日期对象转换成字符串传递给Oracle参数,虽然数据库存储的日期格式是MM/DD/YYYY,但Oracle驱动会根据当前会话的NLS_DATE_FORMAT设置解析字符串日期。如果会话默认格式和你生成的%-m/%-d/%Y格式不匹配(比如会话默认是DD/MM/YYYY),就会把月份部分误判为日期,导致“无效月份”错误。

解决方案

推荐方案:直接传递日期类型对象

去掉strftime转换,直接传递datetime或pd.Timestamp对象,驱动会自动处理类型转换,无需手动格式化:

today = pd.Timestamp.today()
yday = date.today() - timedelta(days=1)

trades_df = pd.read_sql_query(trades, con, params = {"startdate":today, "enddate":yday})

备选方案:统一会话日期格式(不推荐)

如果必须用字符串传递,需先设置会话的日期格式与你的字符串格式匹配,执行查询前先运行:

ALTER SESSION SET NLS_DATE_FORMAT = 'MM/DD/YYYY'

这种方式依赖会话配置,稳定性不如直接传递日期对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:57:06