2016-03-31 16 views
0

Alt sorguda olmayan (çok fazla olması gereken) tüm kayıtları döndürmeye çalışıyorum ama sonuç alamıyorum.Alt sorguda bulunmayan tüm kayıtları alın

LastAccesstime (datetime) öğesinin, GETDATE() 24 saat içinde olan bir erişim zamanına sahip olmadığı tüm kayıtları istiyorum. bu mantıklı mı? WHERE NOT IN'u da denedim ve aynı sonuçları aldım.

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) 
) 

tablo

bir Kullanıcı Kimliği gibi diğer birçok alandan oluşur ama ben yapmam gerekeni yapmak gerekir doğru sonuç kümesini iade edebilir olduğum zamanlar bu benim soru için önemli değildir. O lastaccesstime varsayarsak

Teşekkür

+2

sadece yapabileceği 'nerede datediff (saat, lastaccesstime, getdate())> 24'? –

cevap

1

Richard'ın cevabı doğru yolda kesinlikle geçmişte zaman. Ancak, datediff(), kullanmak için doğru işlev değil. İki tarih/saat değeri arasında sınırları sayısını sayar. Yani, "2016-01-01 23:59" ve "2016-01-02 00:01" bir gün ara veriyor (gece yarısı sınırı nedeniyle).

SQL Server, tarihlerde doğrudan karşılaştırmalar kullanmak daha iyidir:

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

ayrıca lastaccesstime bir dizinin yararlanabilir avantajı bu.

Not:

Sizin sorgu GETDATE() zamanı bileşeni dahil etmek istemiyoruz düşündürmektedir. Eğer öyleyse, sadece date veri türüne dökme:

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

Teşekkür ederim bu mantıklı ve beklendiği gibi çalışıyor –

3

sonra

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

Bu işe yaramalı. Neden bu kadar karmaşık yaptığımı bilmiyorum. Teşekkür ederiz :) –

İlgili konular