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)) >= 20Agora 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!
Nenhum comentário:
Postar um comentário