2010-01-13 5 views
5

Ich habe eine Spalte in meinem SQL Server 2005 Tabelle, die die Anzahl der Monate, die ein Mitarbeiter in Betrieb war halten sollte.Wie bekomme ich die Anzahl an Monaten zwischen zwei Daten in SQL Server 2005

Da ich auch das Datum habe, an dem der Mitarbeiter beschäftigt war, möchte ich, dass die Spalte "monates_In_Service" eine berechnete Spalte ist.

Jetzt, wenn ich DATEDIFF(month,[DateEngaged],GETDATE()) als Formel für die Monate im Dienst berechnete Spalte verwenden, sind die Ergebnisse einige Male korrekt und andere Male falsch.

Was wäre der zuverlässigere Weg, um die Anzahl der Monate zwischen dem DateEngaged-Wert und dem aktuellen Datum zu erhalten? Welche Formel sollte ich in meiner berechneten Spalte verwenden?

+0

Könnten Sie einige Beispiele dafür geben, was Sie meinen, wenn Sie sagen, dass sie manchmal richtig sind und manchmal Das sind sie nicht. –

+0

Könnten Sie das bitte neu schreiben (editieren) und sql-server-2005 (oder auch nur sql-server) einstellen? Beachten Sie die Bindestriche. Es gibt Benutzer, die SQL Server-Fragen ignorieren (nicht ihre Fachkenntnisse), aber an SQL-Fragen interessiert sind. –

+0

DateEngaged = '12/20/2009 " CurrentDate = '1/13/2010" Das gibt mir Monate im Dienst als 1 mit formular "datediff (Monat, [Datumseingabe], getdate() + (1))" Es gibt auch Jahre im Dienst als 1 mit Formel "datediff (Jahr, [DateEngaged], Getdate() + (1))" – StackTrace

Antwort

12

So etwas (vielleicht die 1 und 0, ungetestete tauschen müssen)

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

DATEDIFF Maß Monat Grenzen zB 00.00 Zeit am 1. eines jeden Monats, nicht Tag-of-Monats-Jubiläen

Edit: nach OP Kommentar zu sehen, haben Sie 1 zu subtrahieren, wenn der Starttag> Ende Tag

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

so zum 20. DEZEMBER - 13. Januar, DATEDIFF 1 gibt und dann 20> 13, so subtrahiert 1 = Null mon ths.

+0

das scheint richtig zu funktionieren, ich werde es nur für den Fall mehr testen. – StackTrace

+1

Haben Sie jemals getestet, was passiert, wenn der Mitarbeiter am 31. Oktober eingestellt wurde und das aktuelle Datum der 30. November war? Diese Routine gibt 0 Monate zurück, aber praktisch jede Geschäftsanforderung, die ich mir vorstellen kann, würde sagen, dass dies ein Monat ist. Fand dies auf der Suche nach einer Lösung für genau dieses Problem. Sieht immer noch ...... – Ron

+0

Keine brillante Lösung für das, was @Ron erklärt? – toscanelli

1

Vielleicht wollen Sie so etwas wie:

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

Wenn Sie in diesem Monat vermuten 30 Tage bedeutet für können Sie auch rund vale

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

ich will genau Monat 30 Tage und Jahr zwölf Monate von 30 Tagen bedeuten (jeder !!). – StackTrace

+5

Dies driftet mit der Zeit immer weiter ab. Nach 6 Jahren ist der Fehler einen ganzen Monat lang garantiert – gbn

4

gleichen Ansatz wie gbn, aber mit weniger Tastenanschläge: -)

SELECT 
    DATEDIFF(MONTH, DateEngaged, GETDATE()) + 
    CASE 
     WHEN DAY(DateEngaged) < DAY(GETDATE()) 
     THEN 1 
     ELSE 0 
    END 
Verwandte Themen