【发布时间】:2011-08-18 20:28:09
【问题描述】:
我有一个 sql 表。我们将其称为“表”。我正在尝试使用一些 WHERE 子句进行选择。我需要最后一个 where 子句是 OR。通常,我只是这样做:
SELECT *
FROM table
WHERE 1=1
AND (firstName='tom' OR lastName='jones')
但是,在此特定查询中,我需要 OR 的两侧为 DATEDIFFS。我正在尝试获取时间戳和“NOW”之间的差异大于 10 小时或小于 0 小时的所有行。所以,我现在得到的错误是:
SELECT *
FROM table
WHERE 1=1
AND (
DATEDIFF(hh, table.timestamp, GETDATE()) > 10
OR
DATEDIFF(hh, table.timestamp, GETDATE()) < 0
)
我已经尝试了上面的几个不同版本,但似乎没有任何效果。任何帮助将非常感激!我确定我只是盯着它看太久了,这很愚蠢。
一个新的更详细的查询:
是的,我的查询中有两个左连接,这可能是这里有所作为的原因。我试图让我的例子简单,但它最终咬了我。这是一个更相关的查询:
SELECT
tblCheckoutActivity.rid,
tblCheckoutActivity.checkedOutUser,
tblCheckoutActivity.checkedOutTime,
tblCheckoutInventory.serial,
tblCheckoutInventory.unit,
tblCheckoutInventory.tag,
tblCheckoutUsers.firstName,
tblCheckoutUsers.lastName
FROM
tblCheckoutActivity
LEFT JOIN
tblCheckoutInventory
ON
tblCheckoutActivity.scannerID = tblCheckoutInventory.SID
LEFT JOIN
tblCheckoutUsers
ON
tblCheckoutActivity.checkedOutUser = tblCheckoutUsers.badgeID
WHERE
tblCheckoutActivity.checkedInTime Is Null
AND
tblCheckoutInventory.site='San Francisco'
AND
(
DATEDIFF(hh, tblCheckoutActivity.checkedOutTime, GETDATE()) > 10
OR
DATEDIFF(hh, tblChecckoutActivity.checkedOutTime, GETDATE()) < 0
)
ORDER BY tblCheckoutUsers.lastName
【问题讨论】:
-
根据所有的 cmets,我将我的钱放在括号中的不匹配上。您能否快速计算一下您的查询中有多少个 ('s 和 )。
-
此表名中的错字 -
tblChecckoutActivity -
@slothrop - 该死的......我现在觉得自己像个白痴。
-
@Dex 嗯嗯,下一次的一个很好的教训是发布一个实际重现问题的查询:)
-
@Dex: 将
DATEDIFF(hh, tblCheckoutActivity.checkedOutTime, GETDATE()) > 10重写为tblCheckoutActivity.checkedOutTime < DATEADD(hh,10,GETDATE())这样的索引checkedOutTime可以使用。
标签: sql sql-server where datediff