【问题标题】:Issue with a select query (Pyodbc)选择查询问题 (Pyodbc)
【发布时间】:2020-11-17 02:33:22
【问题描述】:

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

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]'=' 附近的语法不正确。(102) (SQLExecDirectW); [42000] [Microsoft][SQL服务器 Native Client 11.0][SQL Server]'=' 附近的语法不正确。(102); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]'=' 附近的语法不正确。(102)")

子查询的东西似乎有问题。我一直无法在网上找到类似的问题,我相信这段代码(或一段非常相似的代码)以前在这个项目中工作过。有人知道是什么原因造成的吗?

【问题讨论】:

  • 您不需要子查询。就WHERE YEAR(created) == 2020 AND ...

标签: python sql ssms pyodbc


【解决方案1】:

SELECTs 不正确。你只想:

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' 

【讨论】:

  • 您好,感谢您的回复。这是我需要的,非常感谢。不知道为什么我认为我需要选择,一双新鲜的眼睛拯救了一天的欢呼
【解决方案2】:

子查询没有意义,也不需要。只需检查 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'

【讨论】:

  • 感谢您的回复非常有用的信息。我的监督
猜你喜欢
  • 2023-03-23
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 2016-07-19
  • 2013-12-27
  • 2013-03-24
相关资源
最近更新 更多