Calculando a idade usando SQL Server
Aprenda a calcular a idade usando o SQL Server
Se você possui um cadastro de clientes, com certeza já precisou calcular a idade com base na data de nascimento. A primeira vista, parece algo muito simples, mas, a aparente simplicidade esconde vários problemas. Existem várias formas de chegar neste resultado. Você vai aprender neste post 3 formas de fazer isso.
1 - DATEDIFF
Essa é a forma mais simples e rápida.
SELECT nome, data_nascimento, DATEDIFF(YY, data_nascimento, GETDATE()) as ano FROM minha_tabela
A função DATEDIFF recebe 3 parâmetros, o primeiro é o tipo de resultado que queremos, o "YY" significa que queremos a diferença em anos entre as datas informadas. O segundo parâmetro seria a data inicial, que é a data de nascimento, e o último parâmetro, é a data final, o "GETDATE()" vai retornar a data atual.
Se você testou em seu banco e dados, vai perceber que existe uma falha nesta abordagem. A função toma como base o ano, sem considerar as demais informações da data. Se hoje for 22/09/2019 e a data de nascimento for 10/10/1970, o resultado vai ser 49. O correto seria 48.
2 - Calcular a diferença em dias e dividir o resultado
Uma forma mais precisa é calcular a diferença em dias entre a data de nascimento e a data atual e depois dividir pelo número de dias do ano.
SELECT nome, data_nascimento, DATEDIFF(DD, data_nascimento, GETDATE()) as idade_em_dias, DATEDIFF(DD, data_nascimento, GETDATE())/365.25 as idade FROM minha_tabela
Apesar de usamos o DATEDIFF, uma diferença em relação ao primeiro exemplo é o primeiro parâmetro, onde informamos que queremos a diferença em dias. Ao calcular o campo "idade", perceba que ao invés de dividir a diferença por 365, dividimos o resultado por 365.25 do exemplo é para considerar anos bisextos. A última etapa é converter o resultado em inteiro, para ter a idade de forma correta. Desta forma, a query anterior vai sofrer uma alteração no campo "idade", onde vamos usar a função CAST para converter o resultado da conta em inteiro. A query final vai ficar da seguinte forma:
SELECT nome, data_nascimento, DATEDIFF(DD, data_nascimento, GETDATE()) as idade_em_dias, CAST(DATEDIFF(DD, data_nascimento, GETDATE())/365.25 AS INT) as idade FROM minha_tabela
Este exemplo tem uma precisão maior que o primeiro exemplo deste post, mas, a margem de erro é maior quando o intervalo de tempo entre as datas é menor.
Mas não se preocupe, temos uma outra forma de chegar no resultado correto!
3 - Usar DATEDIFF e corrigir o resultado
Desta vez vamos utilizar mais uma função, que é a DATEADD. Esta função serve para criar uma nova data. Vamos criar uma nova data, adicionando o número de anos calculado pela função DATEDIFF. Nossa consulta vai ficar da seguinte forma:
SELECT nome, data_nascimento, DATEADD(YY, DATEDIFF(YY, data_nascimento, GETDATE()), data_nascimento) as data_atualizada FROM minha_tabela
Da mesma forma que a função DATEDIFF, a função DATEADD recebe 3 parâmetros. O primeiro é o tipo de adição que vamos fazer na data, o valor "YY" informa que queremos adicionar anos. O segundo parâmetro é a quantidade de anos que queremos adicionar, neste exemplo, este valor vem do resultado do DATEDIFF. Por fim, o último parâmetro é a data de referência para criar a nova data, em nosso exemplo, é a data de nascimento.
Vamos combinar as funções DATEDIFF e DATEADD para chegar na idade correta, para isso, vamos utilizar o resultado da função DATEADD para fazer ajustes no último parâmetro da função DATEDIFF, que é a data atual.
Se a data calculada pelo DATEADD for maior que a data atual, vamos substrair 1. Para fazer isso, vamos precisar trabalhar com uma condição, para isso, vamos utilizar um CASE. Nossa query ficará da seguinte forma:
SELECT nome, data_nascimento, DATEDIFF(YY, data_nascimento, GETDATE() - CASE WHEN DATEADD(YY, DATEDIFF(YY, data_nascimento, GETDATE()), data_nascimento) > GETDATE() THEN 1 ELSE 0 as idade FROM minha_tabela
O CASE vai avaliar a condição informada, que é o resultado da data criada pelo DATEADD comparado com a data atual. Se o resultado for maior retorna um, caso contrário, zero.
Após muito esforço, finalmente chegamos no resultado correto!
Aqui tem alguns links para você ter mais informações sobre as funções que vimos neste post.