Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQL Server – Como calcular a diferença em anos (idade) entre duas datas utilizando T-SQL ou CLR

Post Views 15,526 views
Reading time 4 minutes

Olá pessoal,
Tudo bem ?

Neste post eu gostaria de mostrar como calcular a diferença em anos (idade) entre duas datas no SQL Server, mostrando algumas soluções e uma análise de performance entre essas opções a fim de identificar a forma mais performática de realizar esse cálculo.

Como vocês sabem, para resolver esse questão não basta realizar um simples DATEDIFF(YEAR, @Dt_Inicial, @Dt_Final), uma vez que a função DATEDIFF(YEAR…) vai retornar a diferença de anos sem considerar se as datas já “completaram aniversário”.

Numa explicação simples, a função DATEDIFF(YEAR…) retorna o cálculo YEAR(@Dt_Final) – YEAR(@Dt_Inicial).

Vou demonstrar porque isso não funciona para cálculo de idade:

Como vocês puderam observar, não basta usar a função DATEDIFF(YEAR..) para calcular a idade. No primeiro exemplo, com apenas 1 dia de diferença entre as datas, a função me retornou que essa diferença é de 1 ano.

No segundo exemplo, a função me retorna 30 anos de diferença, mas a primeira data é do dia 09/04 e a segunda é 28/05, ou seja, ainda não completou mais 1 ano e o valor correto seria 29 anos.

Como calcular idade usando T-SQL

Agora vou demonstrar duas formas simples para cálculo de idade utilizando Transact-SQL

Cálculo de idade utilizando Transact-SQL e CASE

Para realizar esse cálculo, calculamos a diferença de anos entre as datas e diminuímos 1 caso o mês e dia da data inicial seja menor que o mês e dia da data final.

Cálculo de idade utilizando Transact-SQL e divisão por 365.25

Para realizar esse cálculo, calculamos a diferença de dias entre as datas e dividimos esse valor por 365,25. Mas porquê esse 0,25? A resposta é simples.. Anos bissextos. Essa “técnica” é de autoria do meu amigo e especialista em BI, Lucas Galon.

Como calcular idade usando CLR

Agora vou demonstrar duas formas simples para cálculo de idade utilizando o CLR, que vista obter um grande ganho de performance em virtude das otimizações da linguagem C# e do Microsoft .NET Framework.

Cálculo de idade utilizando CLR e cálculos manuais

Para realizar esse cálculo, calculamos a diferença de anos entre as datas e diminuímos 1 caso o mês e dia da data inicial seja menor que o mês e dia da data final.

Cálculo de idade utilizando CLR e divisão por 365.25

Para realizar esse cálculo, calculamos a diferença de dias entre as datas e dividimos esse valor por 365.25, conforme já falado acima, mas agora utilizando o CLR.

Resultados das funções apresentadas

Testes de Performance

Agora que demonstrei algumas soluções diferentes para cálculo de idade no SQL Server, vou comparar a performance de todas elas e verificar qual é a mais performática.

Como eu já havia comentado no post SQL Server – Comparação de performance entre Scalar Function e CLR Scalar Function, funções CLR geralmente terão uma performance melhor que funções T-SQL, ao mesmo tempo que funções inline (sem criar UDF) geralmente apresentam uma performance melhor que funções CLR. Vamos ver como cada solução se sai.

Para esses testes, vou utilizar uma base de 131.072 datas aleatórias para calcular a idade comparando com a data atual, e o script para gerar essa base eu vou disponibilizar logo abaixo:

Script para geração da massa de testes

Script para realização dos testes

Resultados:

Como o esperado, as funções inline apresentaram a melhor performance, com o CLR apresentando uma performance parecida e as funções T-SQL demorando muito mais que as outras 2 soluções. Além disso, a solução com divisão por 365.25 foi melhor que o uso de CASE em todos os 3 cenários.

And that's it, folks!
Espero que vocês tenham aprendido a calcular a idade corretamente e com a melhor performance possível.
Um abraço e até a próxima.