2010-01-13 8 views
5

Mam kolumnę w moim tablecie SQL Server 2005, która powinna zawierać liczbę miesięcy, kiedy pracownik był w użyciu.jak uzyskać numer w miesiącach między dwiema datami w serwerze sql 2005

Ponieważ mam również datę zatrudnienia pracownika, chcę kolumna "months_In_Service", aby być kolumną obliczoną.

Teraz, jeśli używam DATEDIFF(month,[DateEngaged],GETDATE()) jako wzoru dla miesięcy w kolumnie obliczeniowej usługi, wyniki są poprawne kilka razy, a inne razy niepoprawne.

Jaki byłby lepszy sposób na uzyskanie liczby miesięcy między wartością DateEngaged a bieżącą datą? Której formuły powinienem użyć w mojej kolumnie obliczeniowej?

+0

Czy możesz podać przykłady tego, co masz na myśli mówiąc, że czasami są poprawne i imes nie są. –

+0

Czy możesz powtórzyć to (edytować) i ustawić serwer sql-2005 (lub nawet serwer sql)? Zwróć uwagę na kreski. Są tu użytkownicy, którzy ignorują pytania SQL Server (nie ich wiedzę), ale są zainteresowani pytaniami SQL. –

+0

DateEngaged = '12/20/2009 " CurrentDate = '1/13/2010" To daje mi miesiące w usłudze jako 1 przy użyciu formatu "datated" (miesiąc, [DateEngaged], getdate() + (1)) " Daje to również lata w usłudze jako 1 przy użyciu wzoru "datediff (rok, [DateEngaged], getdate() + (1))" – StackTrace

Odpowiedz

12

Coś (może trzeba zamienić 1 i 0, niesprawdzone)

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

miara DateDiff miesiąc granice np 00:00 czasu w dniu 1 każdego miesiąca, a nie dzień-of-miesiąca rocznice

Edycja: po obejrzeniu komentarz OP, trzeba odjąć 1, jeśli dzień dzień startu> koniec

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

więc na 20 grudnia do 13 stycznia, DateDiff daje 1, a następnie 20> 13 więc odjąć 1 = zerowy mon ths.

+0

to wydaje się działać poprawnie, po prostu przetestuję to na wszelki wypadek. – StackTrace

+1

Czy kiedykolwiek sprawdzałeś, co się dzieje, gdy pracownik zaangażował się 31 października, a aktualna data to 30 listopada? Ta procedura zwraca 0 miesięcy, ale w rzeczywistości praktycznie każdy wymóg biznesowy, jaki mogę sobie wyobrazić, powiedziałby, że to miesiąc. Znalazłem to szukając rozwiązania tego problemu. Nadal szukasz ...... – Ron

+0

Nie genialne rozwiązanie tego, co wyjaśnia @Ron? – toscanelli

1

Może chcesz coś takiego:

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

Jeśli założyć, że miesiąc to znaczy przez 30 dni można także okrągły vale

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

Dokładnie chcę, aby miesiąc oznaczał 30 dni i rok dwunastu miesięcy po 30 dni (każdy !!). – StackTrace

+5

Z biegiem czasu dryfuje coraz to dalej. Po 6 latach błąd jest gwarantowany na cały miesiąc – gbn

4

samo podejście jak gbn, ale z mniejszą ilością klawiszy: -)

SELECT 
    DATEDIFF(MONTH, DateEngaged, GETDATE()) + 
    CASE 
     WHEN DAY(DateEngaged) < DAY(GETDATE()) 
     THEN 1 
     ELSE 0 
    END 
Powiązane problemy