python - Python - 将日期时间参数传递给 SQL 命令
问题描述
我正在尝试在 Python 中做这样的事情,
SQLCommand = ("Delete From %s where [Date] >= %s and [Date] <= %s", (calendar_table_name, required_starting_date, required_ending_date))
cursor.execute(SQLCommand)
calendar_table_name
是一个string
变量
required_starting_date
是一个datetime
变量
required_ending_date
是一个datetime
变量
尝试这样做会给我一个错误:
要执行的第一个参数必须是字符串或 unicode 查询。
试过这个,它给了我同样的错误:
SQLCommand = ("Delete From " + calendar_table_name + " where [Date] >= %s and [Date] <= %s", ( required_starting_date, required_ending_date))
cursor.execute(SQLCommand)
编辑:
type(required_ending_date)
Out[103]: pandas._libs.tslibs.timestamps.Timestamp
type(required_starting_date)
Out[103]: pandas._libs.tslibs.timestamps.Timestamp
这对我来说适用于 SSMS,
delete from [table_test] where [Date] >= '2007-01-01' and [Date] <= '2021-01-01';
更新:-这是我正在尝试的代码
Delete_SQLCommand = f"Delete FROM [{calendar_table_name}] WHERE [Date]>=? And [Date]<=?"
params = (required_starting_date, required_ending_date)
required_starting_date & required_ending_date 是“时间戳”格式
calendar_tbl_connection = pyodbc.connect(driver=driver, server=required_server, database=database_name,
trusted_connection='yes')
calendar_tbl_cursor = calendar_tbl_connection.cursor()
calendar_tbl_cursor.execute(Delete_SQLCommand,params)
calendar_tbl_connection.commit
calendar_tbl_connection.close()
解决方案
Timestamp
pyodbc 将 pandas 的值作为正确参数化查询的输入处理没有问题:
# test data
calendar_table_name = "#calendar_table"
crsr.execute(f"CREATE TABLE [{calendar_table_name}] ([Date] date)")
crsr.execute(f"INSERT INTO [{calendar_table_name}] VALUES ('2019-08-22'),('2019-08-24')")
df = pd.DataFrame(
[(datetime(2019, 8, 23, 0, 0), datetime(2019, 8, 25, 0, 0))],
columns=['required_starting_date', 'required_ending_date'])
required_starting_date = df.iloc[0][0]
required_ending_date = df.iloc[0][1]
print(type(required_starting_date)) # <class 'pandas._libs.tslibs.timestamps.Timestamp'>
# test
sql = f"DELETE FROM [{calendar_table_name}] WHERE [Date]>=? AND [Date]<=?"
params = (required_starting_date, required_ending_date)
crsr.execute(sql, params)
cnxn.commit()
#verify
rows = crsr.execute(f"SELECT * FROM [{calendar_table_name}]").fetchall()
print(rows) # [(datetime.date(2019, 8, 22), )]
推荐阅读
- javascript - 事件的所有处理程序完成后如何执行代码
- r - 如何使用 ifelse() 合并 R 中的变量?我尝试过很多次
- javascript - 随机团队生成器
- javascript - 按日期获取一周的第一天
- python - 减少数据但保留 Spark 中的顺序
- r - 不需要神秘的命名空间依赖:'rlang'
- excel - 从 Excel VBA 数据导出到 MS Project 设置行高
- java - 几个不同的地图可以共享同一个键集吗?
- php - Doctrine Symfony ORM 不使用 PHP 7.2 生成 MySQL UUID
- c# - C# 中静态嵌套类中非静态变量的类 Java 替代方案