基于日期的Python过滤SQL查询
我正在尝试构建一个SQL查询,该查询将根据系统日期进行筛选(查询过去7天内完成的所有销售): 我犯了一个错误基于日期的Python过滤SQL查询,python,sql,python-3.x,pandas,psycopg2,Python,Sql,Python 3.x,Pandas,Psycopg2,我正在尝试构建一个SQL查询,该查询将根据系统日期进行筛选(查询过去7天内完成的所有销售): 我犯了一个错误 psycopg2.NotSupportedError: cross-database references are not implemented: datetime.datetime.now datetime.datetime.now()。我建议使用正确的SQL语法来计算当前时间,或者为每个datetime.datetime.now()和datetime.today()创建变量,并在
psycopg2.NotSupportedError: cross-database references are not implemented: datetime.datetime.now
datetime.datetime.now()。我建议使用正确的SQL语法来计算当前时间,或者为每个datetime.datetime.now()和datetime.today()创建变量,并在字符串中替换它们
编辑:不要遵循第二个建议。请参阅下面Martijn Pieters的评论。datetime.datetime.now()
不是正确的SQL语法,因此无法通过read\u SQL()
执行。我建议使用正确的SQL语法来计算当前时间,或者为每个datetime.datetime.now()和datetime.today()创建变量,并在字符串中替换它们
编辑:不要遵循第二个建议。请参阅下面Martijn Pieters的评论。也许您应该删除SQL中的Python代码,用Python计算日期,然后使用strftime函数将其转换为字符串
然后您就可以在SQL查询中使用它们了 也许您应该删除SQL中的Python代码,用Python计算日期,然后使用strftime函数将它们转换为字符串
然后您就可以在SQL查询中使用它们了 您正在将Python语法混合到SQL查询中。SQL是由数据库而不是Python解析和执行的,数据库对datetime.datetime.now()
或datetime.date()
或timedelta()
一无所知!您看到的特定错误是由于Python代码被解释为SQL和SQL,datetime.datetime.now
引用了datetime
数据库中datetime
表的now
列,该列是跨数据库引用,而且psycopg2
不支持涉及多个数据库的查询
相反,使用SQL参数将值从Python传递到数据库。在SQL中使用占位符显示数据库驱动程序中的值应放在哪里:
params = {
# all rows after this timestamp, 7 days ago relative to 'now'
'earliest': datetime.datetime.now() - datetime.timedelta(days=7),
# if you must have a date *only* (no time component), use
# 'earliest': datetime.date.today() - datetime.timedelta(days=7),
}
df = pd.read_sql("""
select store_name,count(*) from sales
where created_at >= %(latest)s""", params=params, con=con)
这使用由定义的占位符,其中%(最新)s
指参数
字典中的最新
键datetime.datetime()
驱动程序直接支持实例
请注意,我还修复了7天前的表达式,并将
之间的语法替换为=
;如果没有第二个日期,您将无法查询两个日期之间的值,因此使用=
将列限制为给定日期或之后的日期。您正在将Python语法混合到SQL查询中。SQL是由数据库而不是Python解析和执行的,数据库对datetime.datetime.now()
或datetime.date()
或timedelta()
一无所知!您看到的特定错误是由于Python代码被解释为SQL和SQL,datetime.datetime.now
引用了datetime
数据库中datetime
表的now
列,该列是跨数据库引用,而且psycopg2
不支持涉及多个数据库的查询
相反,使用SQL参数将值从Python传递到数据库。在SQL中使用占位符显示数据库驱动程序中的值应放在哪里:
params = {
# all rows after this timestamp, 7 days ago relative to 'now'
'earliest': datetime.datetime.now() - datetime.timedelta(days=7),
# if you must have a date *only* (no time component), use
# 'earliest': datetime.date.today() - datetime.timedelta(days=7),
}
df = pd.read_sql("""
select store_name,count(*) from sales
where created_at >= %(latest)s""", params=params, con=con)
这使用由定义的占位符,其中%(最新)s
指参数
字典中的最新
键datetime.datetime()
驱动程序直接支持实例
请注意,我还修复了7天前的表达式,并将
之间的语法替换为=
;如果没有第二个日期,则不会查询两个日期之间的值,因此使用=
将列限制为给定日期或之后的日期。实际上,您不一定需要Python中的任何参数或计算。只需使用对应的SQL语句,该语句应如下所示:
select store_name,count(*)
from sales
where created_at >= now()::date - 7
group by store_name
编辑:我还添加了一个groupby
,我认为这是缺少的。实际上,您不一定需要Python中的任何参数或计算。只需使用对应的SQL语句,该语句应如下所示:
select store_name,count(*)
from sales
where created_at >= now()::date - 7
group by store_name
编辑:我还添加了一个我认为缺少的groupby
。您从未定义过SQL中的datetime
您的between
也无效,您没有和…
部分。您从未定义SQL中的datetime
是什么。您的between
也无效,您没有和…
部分。不,不要只使用字符串中的值生成SQL。使用sql参数;它们确保您得到正确的转义和引用,并使数据库有机会在值更改时重新使用查询计划。请参阅,由于使用了psycopg2
,因此您将%s
用于位置参数,将%(name)s
用于命名参数。请注意,查询还存在一些其他问题,如图所示。用于计算7天前的日期时间的Python代码不正确,并且没有为timedelta
使用datetime
模块引用,并且BETWEEN
运算符缺少和…
部分。不,不要仅使用字符串中的值生成SQL。使用sql参数;它们确保您得到正确的转义和引用,并使数据库有机会在值更改时重新使用查询计划。请参阅,由于使用了psycopg2
,因此您将%s
用于位置参数,将%(name)s
用于命名参数。请注意,查询还存在一些其他问题,如图所示。用于计算7天前的日期时间的Python代码是不正确的,并且不符合u