Python 在SQL查询中使用date range where子句返回空数据帧

Python 在SQL查询中使用date range where子句返回空数据帧,python,sql,pandas,pyodbc,Python,Sql,Pandas,Pyodbc,我在一个数据库中有一个表,其中包含与跨越10多年的事务相关的数百万行。由于将它们全部导入显然是一种浪费,所以我试图导入一部分仅限于特定月份范围的数据。当我尝试使用下面的代码作为连接测试并导入前1000行时,效果很好,但当我在where子句中指定日期范围时,它返回一个空数据框 我真的很感激任何能帮助我纠正这个问题的人。提前谢谢 import pyodbc import pandas as pd conn = pyodbc.connect('Driver={SQL Server};'\ 'Serve

我在一个数据库中有一个表,其中包含与跨越10多年的事务相关的数百万行。由于将它们全部导入显然是一种浪费,所以我试图导入一部分仅限于特定月份范围的数据。当我尝试使用下面的代码作为连接测试并导入前1000行时,效果很好,但当我在where子句中指定日期范围时,它返回一个空数据框

我真的很感激任何能帮助我纠正这个问题的人。提前谢谢

import pyodbc
import pandas as pd
conn = pyodbc.connect('Driver={SQL Server};'\
'Server=NAME;'\
'Database=DBNAME;'\
'Trusted_Connection=yes;')

tquery = """SELECT TOP (1000) * FROM [SALES Transactions_V];"""
df = pd.read_sql_query(tquery, conn)
df.dtypes
输出:

DW_Id                            int64
Company                         object
Campaign Initiative             object
Closing Entry                     bool
Department Code                 object
Description                     object
Document No                     object
Document Type                    int64
Entry No                         int64
Expense Type                    object
GL Account No                   object
Incremental Field       datetime64[ns]
Posting Date            datetime64[ns]
Strategic Initiative            object
Vendor No                       object
Vendor Name                     object
Amount                         float64
GBP Amount                     float64
Actual per CWT                  object
DW_Batch                         int64
DW_SourceCode                   object
DW_TimeStamp            datetime64[ns]
dtype: object

df.head()

DW_Id   Company Campaign Initiative Closing Entry   Department Code Description Document No Document Type   Entry No    Expense Type    ... Posting Date    Strategic Initiative    Vendor No   Vendor Name Amount  GBP Amount  Actual per CWT  DW_Batch    DW_SourceCode   DW_TimeStamp
0   1   ABC Co.,LLC None    False       AGDATA INC. PMJ10000    1   1   None    ... 2007-02-27  None    None    None    -125.25 0.0 None    13726   Nav 2020-05-11 08:50:37.437
1   2   ABC Co.,LLC None    False       AGDATA INC. PMJ10000    1   2   None    ... 2007-02-27  None    AGD01   AGDATA, INC.    125.25  0.0 None    13726   Nav 2020-05-11 08:50:37.437
2   3   ABC Co.,LLC None    False       AGDATA INC. PMJ10000    1   3   None    ... 2007-02-27  None    AGD01   AGDATA, INC.    125.25  0.0 None    13726   Nav 2020-05-11 08:50:37.437
但是,当我使用下面的代码筛选2020年1月4日至2020年3月30日之间的日期范围时,它会给我一个空数据框

df1 = pd.read_sql_query('SELECT * FROM [SALES Transactions_V] WHERE [Posting Date] BETWEEN ''2020-04-01'' AND ''2020-04-30'';', conn)

df1.dtypes

DW_Id                   object
Company                 object
Campaign Initiative     object
Closing Entry           object
Department Code         object
Description             object
Document No             object
Document Type           object
Entry No                object
Expense Type            object
GL Account No           object
Incremental Field       object
Posting Date            object
Strategic Initiative    object
Vendor No               object
Vendor Name             object
Amount                  object
GBP Amount              object
Actual per CWT          object
DW_Batch                object
DW_SourceCode           object
DW_TimeStamp            object
dtype: object
我相信日期范围where子句是导致此问题的原因,但我无法找到解决此问题的方法,因此非常感谢您的任何意见。谢谢

考虑将值传递给SQL查询时的行业最佳实践,并且支持and。这样做可以避免转义引号和串联或插入文字值或变量

sql = '''SELECT * FROM [SALES Transactions_V] 
         WHERE [Posting Date] BETWEEN ? AND ?;
      '''

df1 = pd.read_sql_query(sql, conn, params=['2020-04-01', '2020-04-30'])
或按日期部分:

sql = '''SELECT * FROM [SALES Transactions_V] 
         WHERE YEAR([Posting Date]) = ? 
           AND MONTH([Posting Date]) = ?;
      '''

df1 = pd.read_sql_query(sql, conn, params=[2020, 4])

是的,我做了,它在ssms中工作!否过帐日期字段在此表中没有任何空值!尝试使用Python的三重引号来封装SQL字符串和日期周围的单引号。@Parfait是的,这很有效!非常感谢你!谢谢你!我会记下来的。如果我想在WHERE子句中添加另一个字段,那么这是否意味着我在params中添加另一个值,并按顺序计算它们?听起来不错。并且正确,参数在位置上与准备好的SQL语句中的
(qmarks)对齐。