2010-01-13 41 views
5

Tôi có một cột trong bảng sql server 2005 của tôi phải giữ số tháng mà một nhân viên đã phục vụ.cách lấy số vào tháng giữa hai ngày trong máy chủ sql 2005

Vì tôi cũng có ngày mà nhân viên đã tham gia, tôi muốn cột "months_In_Service" là cột được tính toán.

Bây giờ nếu tôi sử dụng DATEDIFF(month,[DateEngaged],GETDATE()) làm công thức cho các tháng trong cột được tính toán dịch vụ, kết quả chính xác một số lần và các lần khác không chính xác.

Cách nào đáng tin cậy hơn để nhận số tháng giữa giá trị DateEngaged và ngày hiện tại? Tôi nên sử dụng công thức nào trong cột được tính toán của mình?

+0

Bạn có thể cung cấp một số ví dụ về ý của bạn khi bạn nói rằng đôi khi chúng đúng và đôi khi imes họ không. –

+0

Bạn có thể vui lòng gắn thẻ lại (chỉnh sửa) này và thiết lập sql-server-2005 (hoặc thậm chí chỉ là sql-server) không? Lưu ý dấu gạch ngang. Có những người dùng ở đây bỏ qua các câu hỏi SQL Server (không phải chuyên môn của họ) nhưng quan tâm đến các câu hỏi SQL. –

+0

DateEngaged = '12/20/2009 " CurrentDate = '1/13/2010" Điều đó mang lại cho tôi tháng phục vụ như 1 sử dụng formular "dateiff (month, [DateEngaged], getdate() + (1))" Nó cũng cung cấp nhiều năm phục vụ như 1 sử dụng công thức "ngàyiff (năm, [DateEngaged], getdate() + (1))" – StackTrace

Trả lời

12

Giống như (có thể cần phải trao đổi các 1 và 0, chưa được kiểm tra)

datediff(month,[DateEngaged],getdate()) + 
CASE WHEN DATEPART(day, [DateEngaged]) < DATEPART(day, getdate()) THEN 1 ELSE 0 END 

tháng ranh giới đo DATEDIFF ví dụ 0:00 thời gian từ ngày 1 mỗi tháng, không ngày trong tháng kỷ niệm

chỉnh sửa: sau khi nhìn thấy bình luận OP, bạn phải trừ đi 1 nếu ngày ngày bắt đầu> cuối

DATEDIFF (month, DateEngaged, getdate()) - 
CASE 
    WHEN DATEPART(day, DateEngaged) > DATEPART(day, getdate()) THEN 1 ELSE 0 
END 

vì vậy, đối 20 Tháng mười hai - 13 tháng 1, DATEDIFF cho 1 và sau đó 20> 13 nên trừ đi 1 = zero mon ths.

+0

điều này dường như hoạt động chính xác, tôi chỉ thử nghiệm nó nhiều hơn trong trường hợp. – StackTrace

+1

Bạn đã bao giờ thử nghiệm điều gì xảy ra khi nhân viên tham gia vào ngày 31 tháng 10 và ngày hiện tại là ngày 30 tháng 11? Điều này thường xuyên trả về 0 tháng, nhưng trên thực tế, hầu như mọi yêu cầu kinh doanh tôi có thể tưởng tượng sẽ nói đó là một tháng. Tìm thấy điều này tìm kiếm một giải pháp cho vấn đề đó rất. Vẫn đang tìm kiếm ...... – Ron

+0

Không phải là một giải pháp tuyệt vời cho những gì @Ron đang giải thích? – toscanelli

1

Có lẽ bạn muốn một cái gì đó như:

(year(getdate())-year([DateEngaged]))*12+(month(getdate())-month([DateEngaged])) 
-2

Nếu Bạn đoán tháng đó là nghĩa trong 30 ngày Bạn cũng có thể vòng thung lũng

round((datediff(day,[DateEngaged],getdate()))/30.00,0) 
+0

i chính xác muốn tháng có nghĩa là 30 ngày và năm mười hai tháng của 30 ngày (mỗi !!). – StackTrace

+5

Điều này trôi đi xa hơn và xa hơn khi thời gian trôi qua. Sau 6 năm, lỗi là toàn bộ một tháng, được đảm bảo – gbn

4

Cùng cách tiếp cận như gbn, nhưng với tổ hợp phím ít: -)

SELECT 
    DATEDIFF(MONTH, DateEngaged, GETDATE()) + 
    CASE 
     WHEN DAY(DateEngaged) < DAY(GETDATE()) 
     THEN 1 
     ELSE 0 
    END 
Các vấn đề liên quan