2016-03-31 33 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

这应该有效。我不知道我为什么这么复杂。谢谢你:) –