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

Python连接Oracle实现Start_date/End_date自动化及ORA-00936报错求助

修复方案

错误原因

  • SQL拼接时未给日期值加单引号,Oracle会把05/01/2021识别为除法运算而非字符串参数,触发ORA-00936错误
  • 直接拼接SQL存在SQL注入风险,且需要自行处理格式转义,容易出错

推荐写法(参数化查询,无需处理格式、引号问题)

你可以直接用pandas内置的参数传递功能,cx_Oracle驱动会自动适配Oracle的日期类型,无需手动写to_date转换:

import pandas as pd
import cx_Oracle
from datetime import datetime

connstr = 'UN/PW@dbpath/DB'
conn = cx_Oracle.connect(connstr)

# 读取输入并转成datetime对象,提前校验日期格式合法性
start_date_str = input("Enter start_date in MM/DD/YYYY format :")
start_date = datetime.strptime(start_date_str, "%m/%d/%Y")
end_date_str = input("Enter end_date in MM/DD/YYYY format :")
end_date = datetime.strptime(end_date_str, "%m/%d/%Y")

print(start_date_str)
print(end_date_str)

# 用:1 :2作为位置占位符,params按顺序传参
df=pd.read_sql_query("""
select pr_no
, pr_task_no
, act_complete_date_time
from pr_task
where pr_task_no = 100
and act_complete_date_time between :1 and :2
""", conn, params=[start_date, end_date])

快速修复(仅解决当前报错,不推荐生产环境使用)

如果一定要用字符串拼接的写法,给日期参数加上单引号即可:

and act_complete_date_time between to_date('{start_date}','mm/dd/yyyy') and to_date('{end_date}','mm/dd/yyyy') 

注意你原有代码中拆分month, year, day的两行代码没有实际使用,可以直接删除,代码中直接写死的05/01/2021、05/31/2021两行属于冗余代码,也需要删除,否则会被当做除法运算执行,没有实际作用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 08:45:02