Использование функций МЕСЯЦ и ГОД, как предлагается в большинстве ответов, имеет тот недостаток, что SQL Server не сможет использовать какой-либо индекс, который может быть в вашем столбце даты. Это может снизить производительность на большом столе.
Я был бы склонен передать значение DATETIME (например, @StartDate) в хранимую процедуру, которая представляет первый день интересующего вас месяца.
Затем вы можете использовать
SELECT ... FROM ...
WHERE DateColumn >= @StartDate
AND DateColumn < DATEADD(month, 1, @StartDate)
Если вы должны передать месяц и год как отдельные параметры в хранимую процедуру, вы можете сгенерировать DATETIME, представляющую первый день месяца, с помощью CAST и CONVERT, а затем действуйте, как указано выше. Если вы сделаете это, я бы рекомендовал написать функцию, которая генерирует DATETIME из целых значений года, месяца, дня, например, следующее из блога 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
Тогда запрос становится:
SELECT ... FROM ...
WHERE DateColumn >= Date(@Year,@Month,1)
AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))