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?

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top