Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于日期的Python过滤SQL查询_Python_Sql_Python 3.x_Pandas_Psycopg2 - Fatal编程技术网

基于日期的Python过滤SQL查询

基于日期的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()创建变量,并在

我正在尝试构建一个SQL查询,该查询将根据系统日期进行筛选(查询过去7天内完成的所有销售):

我犯了一个错误

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