Korzystanie z funkcji MIESIĄC i ROK, jak sugerowano w większości odpowiedzi, ma tę wadę, że SQL Server nie będzie w stanie użyć żadnego indeksu, który może znajdować się w kolumnie daty. Może to spowodować utratę wydajności przy dużym stole.
Byłbym skłonny przekazać wartość DATETIME (np. @StartDate) do procedury składowanej, która reprezentuje pierwszy dzień miesiąca, który Cię interesuje.
Następnie możesz użyć
SELECT ... FROM ...
WHERE DateColumn >= @StartDate
AND DateColumn < DATEADD(month, 1, @StartDate)
Jeśli musisz przekazać miesiąc i rok jako oddzielne parametry do procedury składowanej, możesz wygenerować DATETIME reprezentujący pierwszy dzień miesiąca za pomocą funkcji RZUTUJ i KONWERTUJ, a następnie postępuj jak powyżej. Jeśli to zrobisz, poleciłbym napisanie funkcji, która generuje DATETIME z liczb całkowitych rok, miesiąc, dzień, np. Następujące z bloga SQL Server .
create function Date(@Year int, @Month int, @Day int)
returns datetime
as
begin
return dateadd(month,((@Year-1900)*12)+@Month-1,@Day-1)
end
go
Zapytanie staje się wtedy:
SELECT ... FROM ...
WHERE DateColumn >= Date(@Year,@Month,1)
AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))