我试图返回所有不在子查询中的记录(其中应该有很多)但我没有得到任何结果。
我希望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,但这对我的问题并不重要,因为一旦我能够返回正确的结果集,我应该能够做我需要做的事情。
由于
答案 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));