Việc sử dụng các hàm MONTH và YEAR như được đề xuất trong hầu hết các câu trả lời có nhược điểm là SQL Server sẽ không thể sử dụng bất kỳ chỉ mục nào có thể có trên cột ngày của bạn. Điều này có thể giết chết hiệu suất trên một bảng lớn.
Tôi có xu hướng chuyển một giá trị DATETIME (ví dụ: @StartDate) cho thủ tục được lưu trữ đại diện cho ngày đầu tiên của tháng mà bạn quan tâm.
Sau đó bạn có thể sử dụng
SELECT ... FROM ...
WHERE DateColumn >= @StartDate
AND DateColumn < DATEADD(month, 1, @StartDate)
Nếu bạn phải chuyển tháng và năm dưới dạng các tham số riêng biệt cho thủ tục được lưu trữ, bạn có thể tạo DATETIME đại diện cho ngày đầu tiên của tháng bằng cách sử dụng CAST và CONVERT, sau đó tiếp tục như trên. Nếu bạn làm điều này, tôi khuyên bạn nên viết một hàm tạo DATETIME từ các giá trị số nguyên năm, tháng, ngày, ví dụ như sau từ blog 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
Sau đó truy vấn trở thành:
SELECT ... FROM ...
WHERE DateColumn >= Date(@Year,@Month,1)
AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))