<pedrocorreia.net ⁄>
corner
<mySearch ⁄> <mySearch ⁄>

corner
 
corner
<mySnippets order="rand" ⁄> <mySnippets order="rand" ⁄>

corner
 
corner
<myContacts ⁄> <myContacts ⁄>

<email ⁄>


pc@pedrocorreia.net

<windows live messenger ⁄>


pedrojacorreia@hotmail.com

<myCurriculum type="pdf" ⁄>


Download
corner
 
corner
<myBlog show="last" ⁄> <myBlog show="last" ⁄>

corner
 
corner
<myNews show="rand" ⁄> <myNews show="rand" ⁄>

corner
 
corner
<myNews type="cat" ⁄> <myNews type="cat" ⁄>

corner
 
corner
<myQuote order="random" ⁄> <myQuote order="random" ⁄>

corner
 
corner
<myPhoto order="random" ⁄> <myPhoto order="random" ⁄>

<pedrocorreia.net ⁄>
corner
 
corner
<myAdSense ⁄> <myAdSense ⁄>

corner
 
corner
<myVisitorsMap ⁄> <myVisitorsMap ⁄>

corner
 
 

<Calcular a idade em MySQL ⁄ >




clicks: 23772 23772 2007-11-03 2007-11-03 goto mySnippets mySnippets sql  Download  Bookmark This Bookmark This



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:

  1. -- Table "dados_pessoas" DDL
  2.  
  3. CREATE TABLE `dados_pessoas` (
  4. `id` smallint(6) UNSIGNED NOT NULL AUTO_INCREMENT,
  5. `nome` varchar(255) NOT NULL DEFAULT '',
  6. `data_nascimento` date DEFAULT NULL,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;




E preencho-a com a seguinte informação:

  1. INSERT INTO dados_pessoas
  2. (id, nome, data_nascimento)
  3. VALUES
  4. (1, "Jet Li", "26-4-1963");
  5.  
  6. INSERT INTO dados_pessoas
  7. (id, nome, data_nascimento)
  8. VALUES
  9. (2, "Jackie Chan", "7-4-1954");
  10.  
  11. INSERT INTO dados_pessoas
  12. (id, nome, data_nascimento)
  13. VALUES
  14. (3, "Ji-hyun Jun", "30-10-1981");
  15.  
  16. INSERT INTO dados_pessoas
  17. (id, nome, data_nascimento)
  18. VALUES
  19. (4, "Tae-hyun Cha", "25-3-1976");
  20.  
  21. INSERT INTO dados_pessoas
  22. (id, nome, data_nascimento)
  23. VALUES
  24. (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.

  1. <?php
  2.  
  3. //ligação à base de dados
  4. function connectDB(){
  5. $db = mysql_connect("server_addr", "username", "password");
  6. mysql_select_db("database_name",$db) or die("<b><br>Impossivel aceder á base de dados.</b><br>");
  7. return $db;
  8. }
  9.  
  10.  
  11.  
  12. //constantes
  13. define("ISQL_AUX_CALCULATE_AGE","
  14. YEAR(CURRENT_DATE()) - YEAR(`data_nascimento`) -
  15. (
  16. month(CURRENT_DATE()) -
  17. month(`data_nascimento`)<=0 &&
  18. (
  19. day(CURRENT_DATE()) - day(`data_nascimento`)<=0
  20. )
  21. ) As `idade`
  22. ");
  23.  
  24. define("TBL_DADOS","`dados_pessoas`");
  25.  
  26. ?>




Este pequeno excerto de código:
  1. <?php
  2. require_once("settings.inc");
  3.  
  4. $db=connectDB();
  5.  
  6. $const=get_defined_constants();
  7.  
  8. $iSQL="
  9. Select
  10. `id`, `nome`, `data_nascimento`, {$const['ISQL_AUX_CALCULATE_AGE']}
  11. From
  12. {$const['TBL_DADOS']}
  13. ";
  14.  
  15. $sqlResource=mysql_query($iSQL) or die(mysql_error());
  16. while($myrow=mysql_fetch_object($sqlResource)){
  17. $str.="{$myrow->nome} nasceu no dia {$myrow->data_nascimento} e tem {$myrow->idade} anos.<br/>";
  18. }
  19. mysql_free_result($sqlResource);
  20. mysql_close($db);
  21.  
  22. echo $str;
  23. ?>



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!









clicks: 23772 23772 2007-11-03 2007-11-03 goto mySnippets mySnippets sql  Download  Bookmark This Bookmark This