select 查询问题 (Pyodbc)

Issue with a select query (Pyodbc)

我正在使用 Pyodbc 访问 Microsoft SQL 服务器数据库。我在代码中构建了以下查询:

SELECT created, transactionID, balanceEffect
FROM dbo.table
WHERE (SELECT YEAR(created) = 2020) 
  AND (SELECT MONTH(created) = 11) 
  AND (SELECT DAY(created) = 17) 
  AND balanceEffect > 0 
  AND TransactionTypeID = '1321837129837129213' 
ORDER BY created

其中 createdDATE 列。

当开始执行查询时,我看到以下错误:

ProgrammingError: ('42000', "[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near '='. (102) (SQLExecDirectW); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near '='. (102); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near '='. (102)")

子查询的东西好像有问题。我无法在网上找到类似的问题,而且我相信这段代码(或一段非常相似的代码)以前在这个项目中是有效的。有谁知道可能是什么原因造成的?

SELECT不正确。你只想:

WHERE YEAR(created) = 2020 AND 
      MONTH(created) = 11
      DAY(created) = 17 AND
      balanceEffect > 0 AND
      TransactionTypeID = '1321837129837129213' 

或者更简单地说:

WHERE CAST(created as DATE) = '2020-11-17' AND
      balanceEffect > 0 AND
      TransactionTypeID = '1321837129837129213' 

子查询没有意义,也不需要。只需对照文字日期检查 created,如下所示:

SELECT created, transactionID, balanceEffect
FROM dbo.table
WHERE 
    created >= '20201107' and created < '20201108'
    AND balanceEffect > 0 
    AND TransactionTypeID = '1321837129837129213' 
ORDER BY created

您可能希望将日期筛选条件简化为:

CONVERT(date, created) = '20201107'

但是这样效率较低:整个 created 列需要先转换为日期才能进行过滤;这不能利用索引。这就是为什么我推荐半开区间过滤的原因,如第一个查询所示。

当然,如果created没有时间成分,那么你可以这样做:

created = '20201107'