尽量不在 SQL 查询中硬编码日期范围(Python、SQL 服务器)
Posted
技术标签:
【中文标题】尽量不在 SQL 查询中硬编码日期范围(Python、SQL 服务器)【英文标题】:Trying not to hardcode date range in SQL query (Python, SQL server) 【发布时间】:2020-07-31 08:24:25 【问题描述】:我正在使用 Python 连接到 SQL Server 数据库并执行多个“选择”类型的查询,这些查询包含以特定方式编写的日期范围。所有这些查询都具有相同的日期范围,因此与其硬编码,我更愿意将其作为字符串并仅在需要时在一个位置进行更改。 到目前为止,我发现我可以使用 datetime 模块和以下逻辑将日期转换为字符串:
from datetime import datetime
start_date = datetime(2020,1,1).strftime("%Y-%m-%d")
end_date = datetime(2020,1,31).strftime("%Y-%m-%d")
查询示例:
select * from where xxx='yyy' and time between start_date and end_date
我怎样才能让它工作?
编辑 我的代码:
import pyodbc
import sqlalchemy
from sqlalchemy import create_engine
from datetime import datetime
start_date = datetime(2020,1,1).strftime("%Y-%m-%d")
end_date = datetime(2020,1,31).strftime("%Y-%m-%d")
engine = create_engine("mssql+pyodbc://user:pwd@server/monitor2?driver=SQL+Server+Native+Client+11.0")
sql_query = """ SELECT TOP 1000
[mtime]
,[avgvalue]
FROM [monitor2].[dbo].[t_statistics_agg]
where place = 'Europe' and mtime between 'start_date' and 'end_date'
order by [mtime] asc;"""
df = pd.read_sql(sql_query, engine)
print(df)
【问题讨论】:
你遇到了什么问题? 我写的那个选择查询不能这样写。 尝试将 start_date 和 end_date 放在引号中。此外,打印您的查询,并显示您的代码。你有什么错误吗? 将我的代码添加到帖子中。在这种形式下它不起作用。但是,如果我只使用字符串 '2020-01-01' 和 '2020-01-31' 就可以了 请参阅 ***.com/questions/24408557/… 以获取有关如何正确安全将参数传递给 Pandas 中的 SQL 查询的指针。根据您的mtime
列的类型,您根本不需要自己转换 Python 日期时间,因为如果使用适当的占位符并单独传递参数,您的驱动程序将为您完成。
【参考方案1】:
感谢大家的意见,我已经找到了使查询工作的答案。变量应如下所示:
start_date = date(2020, 1, 1)
end_date = date(2020, 1, 31)
SQL 查询如下:
sql_query = f""" SELECT TOP 1000
[mtime]
,[avgvalue]
FROM [monitor2].[dbo].[t_statistics_agg]
where place = 'Europe' and mtime between 'start_date' and 'end_date'
order by [mtime] asc;"""
【讨论】:
以上是关于尽量不在 SQL 查询中硬编码日期范围(Python、SQL 服务器)的主要内容,如果未能解决你的问题,请参考以下文章
从表中随机选择行 - Python Pandas 读取 SQL