Question

J'ai une colonne dans mon serveur sql 2005 tableau qui devrait tenir le nombre de mois un employé a été en service.

Depuis que j'ai aussi la date où l'employé a été engagé, je veux la colonne « months_In_Service » d'être une colonne calculée.

Maintenant, si j'utilise DATEDIFF(month,[DateEngaged],GETDATE()) comme la formule pour les mois dans la colonne calculée de service, les résultats sont corrects quelques fois et d'autres fois incorrect.

Quelle serait la meilleure façon fiable pour obtenir le nombre de mois entre la valeur DateEngaged et la date actuelle? Quelle formule dois-je utiliser dans ma colonne calculée?

Était-ce utile?

La solution

Quelque chose comme (peut-être besoin d'échanger 1 et 0, non testé)

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

limites du mois de mesure DATEDIFF par exemple 00h00 fois le 1er de chaque mois, et non anniversaires jour de mois

Edit: après avoir vu le commentaire de l'OP, vous devez soustraire 1 si le jour de début> jour de fin

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

Donc, pour 20 décembre au 13 janvier, DATEDIFF donne 1 et 20> 13 donc il faut soustraire 1 = zéro mois.

Autres conseils

Une même approche que GBN, mais avec moins de touches: -)

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

Peut-être que vous voulez quelque chose comme:

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

Si vous présumez que le mois est le sens pendant 30 jours Vous pouvez également vale ronde

round((datediff(day,[DateEngaged],getdate()))/30.00,0)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top