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

