2011-08-18 51 views
1

我有一個sql表。我們將它稱爲'表'。我正在嘗試使用幾個WHERE子句進行選擇。我需要最後的where子句是OR。通常情況下,我只是這樣做:在SQL中用DATEDIFFS分組OR子句

SELECT * 
FROM table 
WHERE 1=1 
AND (firstName='tom' OR lastName='jones') 

然而,在這個特定的查詢,我需要的或雙方是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 
+0

它給你什麼錯誤? –

+0

哪個實現? SQLServer的? – MPelletier

+0

Microsoft SQLServer。 – Dex

回答

-1
SELECT * 
FROM table 
WHERE 
     DATEDIFF(hh, table.timestamp, GETDATE()) > 10 
UNION 
SELECT * 
FROM table 
WHERE 
     DATEDIFF(hh, table.timestamp, GETDATE()) < 0 

快速和骯髒,但它應該工作

+0

爲了提高性能,我無法在相同的數據上運行兩個選擇。我很欣賞你的建議,但它不適合我的情況。謝謝! – Dex

+1

他發佈的查詢應該也能工作:) – Eddy

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 
    ) 

您是否顯示我們的查詢的縮略語版本?在您的示例中缺少此查詢之前是否有代碼?

+0

是的......有兩個左連接和另一個涉及的表。我相信那是複雜化發生的地方。查詢運行良好,但沒有我的DATEDIFF OR子句。 – Dex

+0

嗨安倍 - 我是新來的CTE。一般來說,通過'WITH'子句使用CTE和簡單創建和使用臨時表之間的主要區別是什麼? – Chris

0

如果使用時間戳數據類型,那就是你的問題。您不能在DATETIME和時間戳之間進行DATEDIFF比較。