我有一个sql表。我们称之为“桌子”。我正在尝试使用一些WHERE子句进行选择。我需要最后一个where子句成为OR。通常,我只是这样做:
SELECT *
FROM table
WHERE 1=1
AND (firstName='tom' OR lastName='jones')
但是,在这个特定的查询中,我需要OR的两边是DATEDIFFS。我试图抓住所有行,其中时间戳和“现在”之间的差异大于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
答案 0 :(得分:0)
我认为你的问题出在其他地方。我刚刚运行它没有错误:
with temp as
(
select 1 as id, CAST('10/31/2011' as DATETIME) as timestamp
UNION
SELECT 2, CAST('11/1/2011' as DATETIME)
UNION
SELECT 3, CAST('11/2/2011' as DATETIME)
UNION
SELECT 4, CAST('11/3/2011' as DATETIME)
UNION
SELECT 5, CAST('11/6/2011' as DATETIME)
UNION
SELECT 6, CAST('11/8/2011' as DATETIME)
)
SELECT *
FROM temp
WHERE 1=1
AND (
DATEDIFF(hh, timestamp, GETDATE()) > 10
OR
DATEDIFF(hh, timestamp, GETDATE()) < 0
)
您是否向我们展示了您的查询的缩写版本?您的示例中是否缺少此查询之前的代码?
答案 1 :(得分:0)
如果你正在使用timestamp数据类型,那那就是你的问题。您不能在DATETIME和时间戳之间进行DATEDIFF比较。
答案 2 :(得分:-1)
SELECT *
FROM table
WHERE
DATEDIFF(hh, table.timestamp, GETDATE()) > 10
UNION
SELECT *
FROM table
WHERE
DATEDIFF(hh, table.timestamp, GETDATE()) < 0
快速而肮脏,但应该可行