Como obter o número em meses entre duas datas no SQL Server 2005
-
20-09-2019 - |
Pergunta
Eu tenho uma coluna na minha tabela SQL Server 2005 que deve manter o número de meses que um funcionário está em serviço.
Como também tenho a data em que o funcionário estava envolvido, quero que a coluna "meses_in_service" seja uma coluna computada.
Agora, se eu usar DATEDIFF(month,[DateEngaged],GETDATE())
Como a fórmula para os meses na coluna computada de serviço, os resultados estão corretos algumas vezes e outras vezes incorretas.
Qual seria a maneira mais confiável de obter o número de meses entre o valor da data e a data atual? Qual fórmula devo usar na minha coluna computada?
Solução
Algo como (pode precisar trocar os 1 e 0, não testados)
datediff(month,[DateEngaged],getdate()) +
CASE WHEN DATEPART(day, [DateEngaged]) < DATEPART(day, getdate()) THEN 1 ELSE 0 END
Datediff Medida Mês Limites Por exemplo
EDIT: Depois de ver o comentário da OP, você deve subtrair 1 se o dia inicial> o dia final
DATEDIFF (month, DateEngaged, getdate()) -
CASE
WHEN DATEPART(day, DateEngaged) > DATEPART(day, getdate()) THEN 1 ELSE 0
END
Então, para 20 de dezembro a 13 de janeiro, o datediff dá 1 e depois 20> 13, então subtraia 1 = zero meses.
Outras dicas
Mesma abordagem que GBN, mas com menos teclas :-)
SELECT
DATEDIFF(MONTH, DateEngaged, GETDATE()) +
CASE
WHEN DAY(DateEngaged) < DAY(GETDATE())
THEN 1
ELSE 0
END
Talvez você queira algo como:
(year(getdate())-year([DateEngaged]))*12+(month(getdate())-month([DateEngaged]))
Se você presume que esse mês é o significado por 30 dias, você também pode arredondar o vale
round((datediff(day,[DateEngaged],getdate()))/30.00,0)