在SQL中使用DATEDIFFS对OR子句进行分组

时间:2011-08-18 20:28:09

标签: sql sql-server where datediff

我有一个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 

3 个答案:

答案 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

快速而肮脏,但应该可行