Bên cạnh hàm không xác định, vấn đề tôi thấy là bạn thực hiện các phép tính trên một trường. Điều này (thường) làm cho bất kỳ chỉ mục nào trên trường không thể sử dụng được bởi truy vấn.
Đoạn thứ hai của liên kết này ( Mười lỗi lập trình SQL phổ biến (Hàm trên các cột được lập chỉ mục trong vị từ) ) cung cấp thông tin chi tiết hơn về thời điểm điều này xảy ra, cách tránh nó và đôi khi các trình tối ưu hóa có thể sử dụng các chỉ mục mặc dù sử dụng các chức năng.
Nói tóm lại, thay vì dựa vào các trình tối ưu hóa được cải tiến, bạn thường có thể thay đổi truy vấn bằng cách giữ nguyên trường (không thực hiện bất kỳ phép tính nào trên đó), nhưng thay vào đó thực hiện các phép tính (đảo ngược) đối với các giá trị khác. Trong trường hợp của bạn cho đến ngày hiện tại được cung cấp bởi GetDate()
. Sau đó, truy vấn có thể sử dụng chỉ mục của trường table1.Date
.
Vì vậy, bạn có thể sử dụng một cái gì đó như:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
BETWEEN
/* First Day of Current Month */
AND
/* Last Day of Current Month */
Và bạn chỉ cần tìm các hàm giúp bạn có được ngày đầu tiên và ngày cuối cùng của tháng hiện tại.
Bài đăng trên blog này có thể giúp bạn: sql-server-query-to-find-first-and-last-day-current-month /
Tuyệt vời hơn nữa, câu hỏi / câu trả lời StackOverflow này: simple-way-to-create-a-date-that-is-the-first day-of-the-month-given -a-ngày khác
Tôi sẽ phải kiểm tra nhưng tôi nghĩ rằng sự thay đổi nhỏ này của những điều trên sẽ làm được:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
>= /* First Day of Current Month */
DATEADD(mm, DATEDIFF(mm, 0, GetDate() ), 0)
AND table1.Date
< /* First Day of Next Month */
DATEADD(mm, 1 + DATEDIFF(mm, 0, GetDate() ), 0)