Aqui vai mais um simples snippet, o titulo por si só já é sugestivo do que irá ser tratado, como calcular a idade de uma pessoa? O MySQL (que eu saiba ^^'') não traz nenhuma funcionalidade que permita calcular directamente a idade, porém tal não será complicado, basta apenas algumas subtrações e ... uma comparação.
Em variadissimos casos é necessário saber as idades actualizadas, havendo várias hipóteses, entre as quais:
- inserimos directamente a idade da pessoa, o que não é muito dinâmico, pois com o passar dos anos, a idade não perdoa e essa informação irá estar desactualizada e consequentemente os nossos dados serão obsoletos;
- inserimos directamente a idade da pessoa e mudamos manualmente essa informação, hummm, no way, há coisas bem mais interessantes para fazer na vida!
- fazer um script que corra periodicamente os registos e vá actualizando essa informação, será um mal menor, mas estaremos a sobrecarregar o sistema desnecessariamente;
- .......
- guardar a data de nascimento, vamos ler essa data com uma linguagem de scripting, seja ela qual fôr, php, asp*, etc, etc. e calcular a idade, será igualmente um sistema aceitável ... mas não é bem o pretendido;
- guardar a data de nascimento e sempre que seja necessário fazer uma query à tabela,
pedir gentilmente ao mysql para fazer o trabalho todo por nós;
Será nesta última hipótese que irei basear-me.
Supondo que temos uma base de dados com a seguinte estrutura:
-- Table "dados_pessoas" DDL
CREATE TABLE `dados_pessoas` (
`id` smallint(6) UNSIGNED NOT NULL AUTO_INCREMENT,
`nome` varchar(255) NOT NULL DEFAULT '',
`data_nascimento` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
E preencho-a com a seguinte informação:
INSERT INTO dados_pessoas
(id, nome, data_nascimento)
VALUES
(1, "Jet Li", "26-4-1963");
INSERT INTO dados_pessoas
(id, nome, data_nascimento)
VALUES
(2, "Jackie Chan", "7-4-1954");
INSERT INTO dados_pessoas
(id, nome, data_nascimento)
VALUES
(3, "Ji-hyun Jun", "30-10-1981");
INSERT INTO dados_pessoas
(id, nome, data_nascimento)
VALUES
(4, "Tae-hyun Cha", "25-3-1976");
INSERT INTO dados_pessoas
(id, nome, data_nascimento)
VALUES
(5, "Ye-jin Son", "11-1-1982");
Iremos criar um ficheiro chamados
settings.inc que irá conter algumas definições da nossa aplicação, de salientar a mais importante neste snippet, a constante:
ISQL_AUX_CALCULATE_AGE
Basicamente para sabermos a idade, basta diminuir o ano actual pelo ano de nascimento, porém existirá uma nuance, queremos saber a idade real e actualizada, ou seja, se já tiver passado a data de aniversário da pessoa, essa informação será válida, poderemos somente basearmos-nos no ano, no entanto caso ainda não tenha chagado a data de aniversário, diminuir somente os anos irá dar uma informação errónea, pois vai dar 1 ano a mais, por ex:
- se estivermos no dia
03-11-2007
- se a pessoa nasceu a 02-11-1990, 2007-1990=17, é a idade correcta;
- se a pessoa nasceu a 04-11-1990, 2007-1990=17, é a idade
incorrecta, pois só
amanha é que irá completar o 17º aniversário.
Daí
termos de andar um pouco mais nada data. Vamos ter de analisar o mês e o dia igualmente, aqui vai estar a pequena nuance do problema. Em Mysql quando efectuamos uma comparação é retornado 1 (true) ou 0 (false), vamos usar esta informação para verificar se o dia de aniversário (dia/mês) já passou ou não.
<?php
//ligação à base de dados
function connectDB(){
$db = mysql_connect("server_addr", "username", "password");
mysql_select_db("database_name",$db) or die("<b><br>Impossivel aceder á base de dados.</b><br>");
return $db;
}
//constantes
define("ISQL_AUX_CALCULATE_AGE","
YEAR(CURRENT_DATE()) - YEAR(`data_nascimento`) -
(
month(CURRENT_DATE()) -
month(`data_nascimento`)<=0 &&
(
day(CURRENT_DATE()) - day(`data_nascimento`)<=0
)
) As `idade`
");
define("TBL_DADOS","`dados_pessoas`");
?>
Este pequeno excerto de código:
<?php
require_once("settings.inc");
$db=connectDB();
$const=get_defined_constants();
$iSQL="
Select
`id`, `nome`, `data_nascimento`, {$const['ISQL_AUX_CALCULATE_AGE']}
From
{$const['TBL_DADOS']}
";
$sqlResource=mysql_query($iSQL) or die(mysql_error());
while($myrow=mysql_fetch_object($sqlResource)){
$str.="{$myrow->nome} nasceu no dia {$myrow->data_nascimento} e tem {$myrow->idade} anos.<br/>";
}
mysql_free_result($sqlResource);
mysql_close($db);
echo $str;
?>
Irá enviar para o output a seguinte informação:
Jet Li nasceu no dia 1963-04-26 e tem 44 anos.
Jackie Chan nasceu no dia 1954-04-07 e tem 53 anos.
Ji-hyun Jun nasceu no dia 1981-10-30 e tem 26 anos.
Tae-hyun Cha nasceu no dia 1976-03-25 e tem 31 anos.
Ye-jin Son nasceu no dia 1982-01-11 e tem 25 anos.
Atenção que esta informação gerada (calculo das idades) é baseada no dia 03-11-2007, neste snippet não irá actualizar-se ;-)
Qualquer erro/ dúvida é só dizer!