2012-12-05 34 views

risposta

15

Se si dispone solo di un numero limitato di righe, questo servirà per ottenere tutte le righe in cui DateFinished si trova in questo mese di quest'anno.

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

Questo potrebbe diventare piuttosto lento su un gran numero di righe anche se - in questo caso utilizzando DateAdd, DatePart e BETWEEN è probabilmente più appropriato, e possono usufruire di indici (non ho il tempo di scrivere un rispondi coinvolgendo quelli adesso!)

+0

la tua parte mese è disattivata? – Moose

+0

@Moose Grazie - stava ancora modificando :-) – Bridge

+0

Questo funzionerà - ma non sarà molto efficiente dato che l'uso di 'YEAR()' o 'MONTH()' sulla colonna impedisce fondamentalmente a SQL Server di utilizzare qualsiasi indice. Se l'OP ha bisogno di questo spesso, potrebbe essere utile creare due ** colonne calcolate, persistenti ** che contengono il mese/anno per ogni riga e quindi le query su quelle. –

9

Proprio come alternativa - questo dovrebbe usare un indice su DateFinished.

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

Questo include il primo del mese successivo, evito questo facendo l'ultima riga: DATEADD (DAY, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, GETDATE()) + 1, 0)) – PCurd

+0

Buona cattura, Ho perso questo. – Moose

Problemi correlati