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
其中 created
是 DATE
列。
当开始执行查询时,我看到以下错误:
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'
我正在使用 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
其中 created
是 DATE
列。
当开始执行查询时,我看到以下错误:
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'