2012-12-05 23 views

Trả lời

15

Nếu bạn chỉ có một số hàng nhỏ, điều này sẽ thực hiện để nhận tất cả các hàng có số DateFinished vào tháng này trong năm nay.

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

này có thể nhận được khá chậm so với một số lượng lớn hàng mặc dù - trong trường hợp này sử dụng DateAdd, DatePartBETWEEN có lẽ là thích hợp hơn, và có thể tận dụng lợi thế của các chỉ số (Tôi không có thời gian để viết một câu trả lời liên quan đến những người đó ngay bây giờ!)

+0

phần tháng của bạn bị tắt? – Moose

+0

@Moose Thanks - vẫn đang chỉnh sửa :-) – Bridge

+0

Thao tác này sẽ hoạt động - nhưng sẽ không hiệu quả vì sử dụng 'YEAR()' hoặc 'MONTH()' trên cột của bạn về cơ bản ngăn SQL Server sử dụng bất kỳ chỉ mục nào. Nếu OP cần điều này thường xuyên, nó có thể hữu ích để tạo ra hai ** **, tồn tại ** cột giữ tháng/năm cho mỗi hàng và sau đó truy vấn trên những người. –

9

Cũng giống như một giải pháp thay thế - điều này sẽ sử dụng chỉ mục trên DateFinished.

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

Điều này bao gồm tháng đầu tiên của tháng tiếp theo, tôi tránh điều này bằng cách thực hiện dòng cuối cùng: DATEADD (DAY, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, GETDATE()) + 1, 0)) – PCurd

+0

Tôi bỏ lỡ điều đó. – Moose

Các vấn đề liên quan