2016-04-12 9 views
0

Son 31 günde, herhangi bir kopyanın ödünç alınmadığı mağazadaki tüm DVD başlıklarının listesini görüntülemek istiyorum (DateOut >= Current_date – 31) Visual Studio'da GridView'da Asp. Aşağıda bir SQL sorgusu var ama hiçbir fikri WHERE maddede ne koymak zorunda:Son 31 gün içinde ödünç verilmeyen DVD verilerini göster (bir ay)

SELECT t.* 
FROM DVDTitle t 
WHERE NOT EXISTS (SELECT 1 
        FROM DVDCopy c JOIN 
         DVDLoan l 
         ON c.CopyNumber = l.CopyNumber 
        WHERE t.DVDNumber = c.DVDNumber AND 
         l.DateOut >= DATEADD(day, -31, GETDATE()) 
       ); 

Her durumda:

SELECT DVDTitle.DVDNumber, DVDTitle.DVDTitle 
    FROM DVDTitle 
    INNER JOIN DVDCopy 
    ON DVDTitle.DVDNumber = DVDCopy.DVDNumber 
    INNER JOIN Loan 
    ON DVDCopy.CopyNumber = Loan.CopyNumber 
    WHERE <what goes here?> 
    ORDER BY DVDTitle.DVDNumber; 
+0

kullandığınız hangi veritabanı? Lütfen uygun bir şekilde etiketleyin. –

+0

Visual Studio'da T-SQL kullanıyorum – Som

cevap

0

Ben bu tür sorgu için NOT EXISTS kullanmayı düşünme Son durumdaki tarih aritmetiği veritabanları arasında çok farklılık gösterir. Bu, SQL Server tarih fonksiyonlarını kullanarak (daha doğrusu). ANSI standardı daha çok l.DateOut >= CURRENT_TIMESTAMP - INTERVAL '31 DAY' olacaktır.

0

Kullanım DATEDIFF() ve GETDATE()

DATEDIFF: https://msdn.microsoft.com/en-us/library/ms189794.aspx

GETDATE: https://msdn.microsoft.com/en-us/library/ms188383.aspx

WHERE DATEDIFF(day, Loan.DateOut, GETDATE()) >= 31 
+0

SQL Server her satır için bu tarihçe işlevini değerlendirmek zorunda olduğundan, bu en uygun olmayacak. Loan.DateOut <= DATEADD (gün, -31, getdate()) 'gibi bir şey yapmanın daha iyi olması, optimize edicinin bu eşitsizliğin sağ tarafının statik bir değer olduğunu ve sadece bir kez hesaplayacağını fark edecek kadar akıllıdır. –