Frage

Ich habe eine Spalte in meiner SQL Server 2005 -Tabelle 2005, in der die Anzahl der Monate gehalten werden sollte, die ein Mitarbeiter im Dienst war.

Da ich auch das Datum habe, an dem der Mitarbeiter engagiert wurde, möchte ich, dass die Spalte "Monate_in_Service" eine berechnete Spalte ist.

Nun, wenn ich benutze DATEDIFF(month,[DateEngaged],GETDATE()) Da die Formel für die monatelange Berechnungspalte in der Dienstleistung korrekt sind, sind die Ergebnisse manchmal korrekt und in anderen Fällen falsch.

Was wäre der bessere zuverlässige Weg, um die Anzahl der Monate zwischen dem Datum des Datums und dem aktuellen Datum zu erhalten? Welche Formel sollte ich in meiner Computerspalte verwenden?

War es hilfreich?

Lösung

So etwas wie (muss möglicherweise die 1 und 0 tauschen, ungetestete)

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

Datiff messen monatgrenzen, z. 00:00 Zeit am 1. eines jeden Monats, nicht am Tag des Monatsanwalters

Bearbeiten: Nachdem Sie den Kommentar von OP gesehen haben, müssen Sie 1 subtrahieren, wenn der Starttag> Endtag

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

Für 20. Dezember bis 13. Januar gibt datier 1 und dann 20> 13, also subtrahieren Sie 1 = null Monate.

Andere Tipps

Gleicher Ansatz wie GBN, aber mit weniger Tastenanschlägen :-)

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

Vielleicht willst du so etwas wie:

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

Wenn Sie davon ausgehen, dass dieser Monat 30 Tage lang ist, können Sie auch die Vale runden

round((datediff(day,[DateEngaged],getdate()))/30.00,0)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top