【问题标题】:PYODBC - Conversion failed when converting date and/or time from character string - No clue what to do [duplicate]PYODBC - 从字符串转换日期和/或时间时转换失败 - 不知道该怎么做[重复]
【发布时间】:2020-04-21 04:22:59
【问题描述】:

尝试根据报告的生产日期动态地将 SQL Server 数据库表加载到 Python pandas DataFrame 中。当我写作时,我的问题如下:

import pyodbc
conn = pyodbc.connect(server = "10.87.254.73", Database= "CTData", Driver ="{SQL Server}")
PCBondsDB = pd.read_sql_query("Select * From [MarketData].[pcbond].[PCbonds] where ClosingDate = '2020-04-13'", conn)
conn.close()

它可以工作,我可以连接到数据库并提取我的表,但是如果我将 where ClosingDate= 更改为包含日期作为字符串的变量,它将无法工作。

假设 DateProd = '2020-04-13' 现在我尝试:

 PCBondsDB = pd.read_sql_query("Select * From [MarketData].[pcbond].[PCbonds] where ClosingDate = 
'DateProd'",

它给我一个错误说:执行失败 sql 'Select * From [MarketData].[pcbond].[PCbonds] where ClosingDate = 'DateProd'': ('22007', '[22007] [Microsoft][ ODBC SQL Server Driver][SQL Server]从字符串转换日期和/或时间时转换失败。(241) (SQLExecDirectW)')

这绝对没有意义,为什么当我将它作为 ClosingDate= '2020-04-13' 的文字传递时它可以工作,但是当我尝试使用一个变量时相同的值和数据类型是字符串)它将不起作用并引发错误。

我尝试了双引号、三倍引号、反转单引号和双引号,似乎没有任何效果。我环顾论坛,找不到这个特定问题的答案。我认为解决方案很简单,但我是 Python 的新手,想知道。我正在尝试使这个动态化,所以是的,我需要使用一个变量...

谢谢

【问题讨论】:

  • 您需要阅读文档或查找有关在 python 中参数化 sql 调用的众多示例、教程或论坛帖子之一。在您的尝试中,您根本没有传递“变量” - 您只是将变量名称作为字符串文字传递。
  • 我现在更好地理解了 params 部分,因为其他人回答了,现在我可以看到我的问题是如何在其他线程中以某种方式回答的。但老实说,如果没有那个提示,我会花更多的时间哈哈哈。也感谢您的输入。我现在已经进入 Python 3 周了,请与我一起裸露 xD

标签: python sql sql-server dataframe pyodbc


【解决方案1】:

您将字符串文字 'DateProd' 作为日期传递。您需要将变量的 作为参数传递,如下所示:

date_prod = '2020-04-13'
sql = "Select * From [MarketData].[pcbond].[PCbonds] where ClosingDate = ?"
param_values = (date_prod, )
pc_bonds_db = pd.read_sql_query(sql, engine, params=param_values)

【讨论】:

  • 感谢人完美!只是一个我理解的问题.. 我尝试直接执行 params = DateProd,它给了我一个错误,说“'SQL 包含 1 个参数标记,但提供了 10 个参数','HY000')”我注意到这样做是 param_values = (DateProd,) ,它将值转换为元组。你知道为什么元组比直接将字符串作为参数更好吗?再次感谢!
  • 查看熊猫文档。 params 需要是列表、元组或字典。简单地传递 str 是行不通的,因为 len("2020-04-13") 是 10,而 len(("2020-04-13", )) 是 1。
  • 我明白了。太好了,非常感谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 2012-04-17
  • 2017-12-07
相关资源
最近更新 更多