2012-12-05 14 views

Odpowiedz

15

Jeśli masz tylko niewielką liczbę wierszy, zrobi to, aby uzyskać wszystkie wiersze, w których DateFinished jest w tym miesiącu tego roku.

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

To może być dość powolny na dużej liczbie wierszy chociaż - w tym przypadku z wykorzystaniem DateAdd, DatePart i BETWEEN jest prawdopodobnie bardziej właściwe, i może skorzystać z indeksami (nie mam czasu, aby napisać odpowiedź z udziałem tych właśnie teraz!)

+0

Twój miesiąc jest wyłączony? – Moose

+0

@Moose Thanks - wciąż edytował :-) – Bridge

+0

To zadziała - ale nie będzie zbyt wydajne, ponieważ używanie kolumny 'YEAR()' lub 'MIESIĄC()' w twojej kolumnie w zasadzie uniemożliwia programowi SQL Server używanie jakichkolwiek indeksów. Jeśli PO potrzebuje tego często, może być przydatne utworzenie dwóch ** obliczonych, utrwalonych ** kolumn, które przechowują miesiąc/rok dla każdego wiersza, a następnie zapytanie o nie. –

9

Tak samo alternatywnie - powinno się użyć indeksu na DateFinished.

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

Obejmuje to pierwszy z następnego miesiąca, unikam tego, tworząc ostatnią linię: DATEADD (DZIEŃ, -1, DATA DATA (MIESIĄC, DATEDIFF (MIESIĄC, 0, GETDATE()) + 1, 0)) – PCurd

+0

Dobry połów, Tęsknie za tym. – Moose

Powiązane problemy