2012-12-05 12 views

Antwort

15

Wenn Sie nur eine kleine Anzahl von Zeilen haben, wird dies tun, um alle Zeilen zu erhalten, in denen DateFinished in diesem Monat dieses Jahres ist.

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

Dies könnte ziemlich langsam über eine große Anzahl von Zeilen bekommen obwohl - in diesem Fall mit DateAdd, DatePart und BETWEEN ist wahrscheinlich besser geeignet, und profitieren Sie von Indizes nehmen kann (ich habe keine Zeit, ein schreiben antwort mit denen gerade jetzt!)

+0

Ihr Monatsteil ist aus? – Moose

+0

@Moose Danke - wurde noch bearbeitet :-) – Bridge

+0

Das wird funktionieren - aber es wird nicht sehr effizient sein, da die Verwendung von 'YEAR()' oder 'MONTH()' auf Ihrer Spalte grundsätzlich verhindert, dass SQL Server irgendwelche Indizes verwendet. Wenn das OP dies häufig benötigt, kann es nützlich sein, zwei ** berechnete, persistente ** Spalten zu erstellen, die den Monat/das Jahr für jede Zeile enthalten und dann diese abfragen. –

9

Nur als Alternative - das sollte einen Index auf DateFinished verwenden.

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

Dies beinhaltet den ersten des nächsten Monats, ich vermeide dies, indem ich die letzte Zeile mache: DATEADD (DAY, -1, DATEADD (MONAT, DATEDIFF (MONAT, 0, GETDATE()) + 1, 0)) – PCurd

+0

Guter Fang, Das habe ich vermisst. – Moose

Verwandte Themen