2016-03-31 52 views
0

我試圖返回不在子查詢中的所有記錄(其中應該有很多)但我沒有得到任何結果。獲取子查詢中不存在的所有記錄

我想要LastAccesstime(日期時間)沒有訪問時間在GETDATE() 24小時內的所有記錄。那有意義嗎?我也嘗試WHERE NOT IN以及得到了相同的結果。

SELECT Firstname, Surname, LastAccesstime 
from Users 
WHERE NOT EXISTS (
SELECT Firstname, Surname, LastAccesstime from Users 
WHERE (LastAccesstime) >= DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) 
AND (LastAccesstime) < DATEADD(day, DATEDIFF(day, 0, GETDATE())+1, 0) 
) 

表包括許多其它領域,包括用戶ID,但因爲一旦我能返回正確的結果集,我應該能夠做什麼,我需要做的,這不是我的問題很重要。

感謝

+2

你可以做'where datediff(hour,lastaccesstime,getdate())> 24'嗎? –

回答

1

理查德的答案肯定是在正確的軌道上。但是,datediff()不是正確的功能使用。它計算兩個日期/時間值之間的邊界數。因此,「2016-01-01 23:59」和「2016-01-02 00:01」相隔一天(因爲午夜邊界)。

在SQL Server中,最好是在日期使用直接的比較:

SELECT u.* 
FROM users u 
WHERE u.lastaccesstime < DATEADD(day, -1, GETDATE()); 

這也具有的優點是,它可以在lastaccesstime採取指數的優勢。

注:

您的查詢表明,你不希望包括時間成分爲GETDATE()。如果是這樣,只需要投入date數據類型:

SELECT u.* 
FROM users u 
WHERE u.lastaccesstime < DATEADD(day, -1, CAST(GETDATE() as DATE)); 
+0

謝謝你這有道理,按預期工作 –

3

假設的LastAccessTime總是在過去然後

SELECT * FROM Users WHERE DATEDIFF(HOUR, ISNULL(lastaccesstime, GETDATE() - 2), GETDATE()) > 24 
+0

這應該有效。我不知道我爲什麼這麼複雜。謝謝你:) –