Tôi có trường datetime được gọi là DateFinished. Tôi cần để có thể lấy tất cả hồ sơ mà DateFinished nằm trong tháng/năm hiện tại.TSQL truy xuất tất cả hồ sơ trong tháng/năm hiện tại
6
A
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
, DatePart
và BETWEEN
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ờ!)
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)
phần tháng của bạn bị tắt? – Moose
@Moose Thanks - vẫn đang chỉnh sửa :-) – Bridge
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. –