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

pandas执行SQL查询如何传入Python日期变量作为过滤条件

pandas+SQLAlchemy连接MSSQL实现日期参数过滤的方案

你原来Oracle版本里用to_char转字符串比较日期的写法没必要迁移到MSSQL,直接做日期类型比较效率更高,也不会出现字符串格式匹配错误的问题。pandas.read_sql_query原生支持参数绑定,不需要手动拼接SQL字符串,就能安全传入Python侧的datetime变量。

可直接运行的修改后代码

位置参数写法(适配pyodbc默认的参数规则,兼容性最好):

lastCheckTime = datetime.datetime.strptime(strDate, "%Y-%m-%d %H:%M:%S")

connection_url = URL.create("mssql+pyodbc", query={"odbc_connect": connection_string})
engine = create_engine(connection_url)

sqldf = pd.read_sql_query(
    """\
SELECT * from ABC, XYZ, LMN, PQR 
WHERE ABC.id = XYZ.id 
  AND XYZ.TO_CLASS != '827' 
  AND ABC.creation_date > ?
ORDER BY ABC.creation_date desc
    """, 
    engine,
    params=[lastCheckTime]
)

如果你更习惯原来Oracle的命名参数写法,SQLAlchemy会自动帮你做适配,不用改参数占位符的风格:

sqldf = pd.read_sql_query(
    """\
SELECT * from ABC, XYZ, LMN, PQR 
WHERE ABC.id = XYZ.id 
  AND XYZ.TO_CLASS != '827' 
  AND ABC.creation_date > :lastCheckTime
ORDER BY ABC.creation_date desc
    """, 
    engine,
    params={"lastCheckTime": lastCheckTime}
)

注意事项

  • 绝对不要用f-string、字符串拼接的方式直接把lastCheckTime拼到SQL语句里,很容易因为MSSQL服务端的日期格式配置差异(比如日/月/年顺序、分隔符区别)导致过滤逻辑错误,还会带来SQL注入风险。
  • 传入参数时直接传Python原生的datetime对象即可,SQLAlchemy和pyodbc会自动完成类型转换,不需要你手动把datetime转成特定格式的字符串。
  • 直接比较日期类型比转成char之后按字典序比较的性能更好,也不会因为日期转字符串时带毫秒、时区后缀导致比较结果出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 23:12:59