19 de mai. de 2009

Calculo de idade via MySql

Hoje me deparei com um pequeno problema: no sistema que estou desenvolvendo precisava realizar uma busca no banco de dados e retornar os cadastros cuja idade fossem maior ou igual a 60 anos. O problema é que não poderia inventar um campo pra inserir a idade, afinal de contas todos nós envelhecemos e no ano seguinte sempre temos um ano a mais, então o campo idade estava descartado, pois ele retornaria dados incorretos ano que vem.

A solução encontrada foi calcular a idade direto no MySql, como? Simples (aliás, nem tão simples assim!):

Primeiro, selecionei a chave primária do registro, data de nascimento e endereço:

SELECT id_cad, nome, nascimento, endereco,

Agora devo calcular a idade do sujeito:


(YEAR(CURDATE()) - RIGHT(nascimento, 4)) - (DATE_FORMAT(CURDATE(), '%e/%m')<LEFT(nascimento, 5)) AS idade

Onde YEAR(CURDATE() pega o ano atual, RIGHT(nascimento, 4) pega os 4 últimos dígitos da data salva no banco, porque? Porque estou usando o formato dd/mm/yyyy pra salvar as datas de nascimento! Fica mais simples exibir estas datas lá no PHP, preferi ter o trabalho pesado aqui no Mysql!

DATE_FORMAT(CURDATE(), '%e/%m') formata o dia e mês atuais para dd/mm, LEFT(nascimento, 5) pega do banco o dia e mês no formato dd/mm.

Analizando a linha toda: estou pegando o ano atual, subtraindo o ano de nascimento do cadastro, a comparação (DATE_FORMAT(CURDATE(), '%e/%m')<LEFT(nascimento, 5) me retorna 1 ou 0 e ajusta a diferença da idade um ano abaixo, caso o cidadão ainda não tenha feito aniversário!



Aqui eu seleciono o banco:
FROM cadhab_dpessoais

E aqui eu filtro os registros conforme a idade, e tudo isso sem ter que usar um campo "idade" na tabela, o que seria meio difícil de atualizar, afinal todo ano nossa idade muda!

WHERE (YEAR(CURDATE()) - RIGHT(nascimento, 4)) >= 20

Agora tudo junto:


SELECT id_cad, nome, nascimento, endereco, (YEAR(CURDATE()) - RIGHT(nascimento, 4)) - (DATE_FORMAT(CURDATE(), '%e/%m')<LEFT(nascimento, 5)) AS idade

FROM cadhab_dpessoais

WHERE (YEAR(CURDATE()) - RIGHT(nascimento, 4)) >= 60

Legal né? Até a próxima!