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

