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

Python执行SQL查询传入日期变量报datetime2与int不兼容如何解决

错误原因

你抛出该错误的核心原因是直接用字符串格式化拼接SQL语句时,datetime.date类型的变量插入到SQL文本中没有被单引号包裹,SQL Server会把2021-10-01识别为减法算术表达式,计算得到整数2010,自然和Inception字段的datetime2类型不兼容。同时这种直接拼接SQL的写法还存在SQL注入风险,非常不推荐。

正确写法(参数化查询,推荐)

直接使用pandas.read_sql_query原生支持的参数传递功能,不需要手动拼接SQL、也不需要处理日期格式转换,pyodbc驱动会自动完成Python日期类型到SQL Server datetime2类型的映射:

import pyodbc
import pandas as pd
import datetime

dt = datetime.date(2021, 10, 1)

server = 'testServer'
database = 'testDatabase'
username = 'test'
password = '{test}'   
driver= '{ODBC Driver 13 for SQL Server}'

conn = pyodbc.connect('DRIVER='+driver+';SERVER=tcp:'+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password)
conn.autocommit = True

# 用?作为参数占位符,不要手动格式化拼接SQL
select_sql = "Select * From test Where Inception <= ?"
# 传入参数元组给params参数即可
sql_query = pd.read_sql_query(select_sql, conn, params=(dt,))

替代方案(仅做参考,不推荐使用)

如果一定要手动拼接SQL,需要把日期变量转成带单引号的标准日期字符串:

select_sql = f"Select * From test Where Inception <= '{dt.strftime('%Y-%m-%d')}'"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:45:02