2012-12-05 30 views

cevap

15

Yalnızca az sayıda satır varsa, bu yılın bu ayında DateFinished'un bulunduğu tüm satırları almak için bunu yapar.

SELECT * 
FROM MyTable 
WHERE Year(DateFinished) = Year(CURRENT_TIMESTAMP) 
       AND Month(DateFinished) = Month(CURRENT_TIMESTAMP) 

Gerçi satır çok sayıda üzerinden oldukça yavaş alabilir - ki bu durumda DateAdd, DatePart ve BETWEEN kullanarak ben bir yazmak için zaman yok (muhtemelen daha uygun olduğunu ve endeksler yararlanabilir Şu anda bunları içeren cevap!)

+0

ay bölümünüz kapalı mı? – Moose

+0

@Moose Teşekkürler - hala düzenleme oldu :-) – Bridge

+0

Bu işe yarar - ancak sütununuzdaki YEAR() 'veya' MONTH() 'işlevini kullanmanız temel olarak SQL Server'ın herhangi bir dizini kullanmasını engelleyeceğinden çok verimli olmaz. OP'nin buna sıkça ihtiyacı varsa, her bir satır için ayı/yılı tutan ve ardından bunları sorgulayan iki ** hesaplanmış, kalıcı ** sütun oluşturmak yararlı olabilir. –

9

Sadece bir alternatif olarak - bu DateFinished'de bir dizin kullanmalıdır.

SELECT * 
FROM MyTable 
WHERE DateFinished BETWEEN 
    DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) 
    AND 
    DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0) 
+4

Bu, bir sonraki ayın ilkini içerir, bunu son satırı yaparak engellerim: DATEADD (GÜNDÜZ, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, GETDATE()) + 1, 0)) – PCurd

+0

İyi yakalama, Onu özledim. – Moose