获取子查询中不存在的所有记录

时间:2016-03-31 13:25:04

标签: sql sql-server

我试图返回所有不在子查询中的记录(其中应该有很多)但我没有得到任何结果。

我希望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)
) 

该表包含许多其他字段,包括UserID,但这对我的问题并不重要,因为一旦我能够返回正确的结果集,我应该能够做我需要做的事情。

由于

2 个答案:

答案 0 :(得分:3)

假设lastaccesstime总是在过去,那么

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

答案 1 :(得分: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));