Problemas para inserir idade no banco de dados

Dúvidas sobre MySQL, PHPMyAdmin, SQL e assuntos relacionado a banco de dados.

Moderador: web

responder a dúvida

Problemas para inserir idade no banco de dados

Mensagem por Von_Reibnitz Offline » Seg Ago 17, 2009 2:17 pm

Olá, estou utilizando este comando para inserir os dados no banco:
Cadastrar_db.php
Código: Selecionar todos
<?
$nome             = $_POST[nome];
$sobrenome        = $_POST["sobrenome"];
$sexo             = $_POST["sexo"];
$data_nasc        = "$_POST[ano]-$_POST[mes]-$_POST[dia]";
$cidade_nasc      = $_POST["cidade_nasc"];
$estado_nasc      = $_POST["estado_nasc"];
$data_falec       = "$_POST[ano2]-$_POST[mes2]-$_POST[dia2]";
$cidade_falec     = $_POST["cidade_falec"];
$estado_falec     = $_POST["estado_falec"];
$nota             = $_POST["nota"];
$idade = floor((strtotime($data_falec) - strtotime($data_nasc))/(60*60*24*365.2425));

$sql = mysql_query("INSERT INTO obitos VALUES ('','$nome','$sobrenome','$sexo','$data_nasc','$cidade_nasc','$estado_nasc','$data_falec','$cidade_falec','$estado_falec','$nota','$idade')");
?>
<h3>Cadastro de Óbito efetuado com sucesso!</h3>
<br>
<meta http-equiv="refresh" content="2;URL=?pg=../estrutura/obituario/listar.php">


mas ao inserir uma pessoa que nasceu em 14/08/1900 e faleceu em 15/08/2009 registra no banco 39 anos?

onde esta o erro?

Jah me disseram para utilizar isso:

Código: Selecionar todos
$dn = "1900-08-14";
$dm = "2009-08-15";

$dtm = new Datetime( $dm );
$anos = $dtm->diff( new Datetime( $dn ) )->y;

var_dump( $anos ); //int(109)


mas não estou sabendo como utilizar isso para inserir a idade correta.
Grato pela atenção.



detalhes...


Von_Reibnitz
MEMBRO
MEMBRO
Mensagens: 27
Registrado em: Ter Jul 22, 2008 1:58 pm
Localização: SC/Caçador/Brasil

Problemas para inserir idade no banco de dados

Mensagem por web Offline » Seg Ago 17, 2009 2:25 pm

Essa seção é para postar scripts pronto, não para tirar dúvidas.

MOVIDO: de Laboratório de scripts para MySQL

Porque não faz o cálculo direto

Código: Selecionar todos
echo $data_falec-$data_nasc;


detalhes...

Gostou do que encontrou? Divulgue, indique, participe, agradeça pelas respostas.

Faço scripts personalizados ou reparos em scripts. Orçamento MSN codigosnaweb [@] hotmail [.] com

Avatar do usuário
web
ADMIN
ADMIN
Mensagens: 11904
Registrado em: Sáb Jan 20, 2007 6:08 pm
Localização: RJ / RJ / Brasil

Problemas para inserir idade no banco de dados

Mensagem por Von_Reibnitz Offline » Seg Ago 17, 2009 2:58 pm

deveria ficar assim então?

Código: Selecionar todos
echo "$dados[data_falec]-$dados[data_nasc])";


detalhes...


Von_Reibnitz
MEMBRO
MEMBRO
Mensagens: 27
Registrado em: Ter Jul 22, 2008 1:58 pm
Localização: SC/Caçador/Brasil

Problemas para inserir idade no banco de dados

Mensagem por Von_Reibnitz Offline » Seg Ago 17, 2009 3:28 pm

a página que exibe os resultados é esta:

obitos.php
Código: Selecionar todos
<?
$pg=$_GET[pg];
$page=$_GET[page];

$dia = "";
$mes = /*$_GET[mes];*/ date("m");
$ano = "";

$busca = "SELECT * FROM obitos WHERE data_falec LIKE '" . date(Y) . "-" . date(m). "%' ";
// termina a função para buscar a categoria

$total_reg = "$qts_ultimos";

if(!$page){
$page = "1";
}

$inicio = $page-1;
$inicio = $inicio*$total_reg;

$limite = mysql_query("$busca LIMIT $inicio,$total_reg");
$todos = mysql_query("$busca");

$tr = mysql_num_rows($todos);
$tp = ceil($tr / $total_reg);

if(mysql_num_rows($todos)>0){
//  if (($todos%2)==0) { $bgcolor="#FFFFFF"; } else { $bgcolor="#C0C0C0"; }

?>
<table width="600" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td align="center"><strong>Foram
      encontrados <? echo "<b><font color=$coronmouse>$tr</font></b>";?> registros!<br />
      <br />
      Exibindo registros de <font color="<? echo $coronmouse?>"><? echo $inicio+1?></font> a <font color="<? echo $coronmouse?>">
        <? if($tp == $page){ echo $tr; } else { echo $inicio+$total_reg;}?>
      </font></strong></td>
  </tr>
  <tr>
    <td height="5" colspan="2"></td>
  </tr>
  <tr>
    <td height="1" colspan="2" background="images/layout/barrinha_divisao_horizontal.gif"></td>
  </tr>
  <tr>
    <td height="5" colspan="2"></td>
  </tr>
</table>
<table width="600" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr align="center">
    <td colspan="2" bgcolor="#99ccff"><b>Nome</b></td>
    <td bgcolor="#99ccff"><img src="images/estrela.gif" width="20" height="18" /></td>
    <td colspan="2" bgcolor="#C0C0C0"><table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td width="45%" bgcolor="#99ccff"><div align="center"><strong><img src="images/cruz.gif" width="20" height="18" /></strong></div></td>
        <td width="28%" bgcolor="#99ccff"><div align="center"><strong>Local</strong></div></td>
        <td width="27%" bgcolor="#99ccff"><div align="center"><strong>Idade</strong></div></td>
      </tr>
    </table></td>
  </tr>
  <tr>
    <td height="5" colspan="5"></td>
  </tr>
  <? while ($dados=mysql_fetch_array($limite)) {?>
  <tr align="center">
    <td width="89" align="left"><div align="left"><b>
      <?=$dados[nome]?>
    </b> </div></td>
    <td width="89" align="left"><div align="right"><b>
      <?
     if($dados[sexo] == 'M') {
echo "<img src=/sistema/images/marte.png>";
} else {
echo "<img src=/sistema/images/venus.png>";
}
?>
    </b></div></td>
    <td width="158" align="center"><table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td width="12%">&nbsp;</td>
        <td width="88%"><div align="center"><strong>
          <? $data=explode("-", $dados[data_nasc]); echo "$data[2]/$data[1]/$data[0]";?>
        </strong></div></td>
      </tr>
    </table></td>
    <td width="316" align="center"><table width="98%" height="23" border="0" cellpadding="0" cellspacing="0">
      <tr>
        <td width="51%"><div align="center">
          <table width="100%" border="0" cellspacing="0" cellpadding="0">
            <tr>
              <td width="14%">&nbsp;</td>
              <td width="86%"><div align="center"><strong>
              <? $data=explode("-", $dados[data_falec]); echo "$data[2]/$data[1]/$data[0]";?>
              </strong></div></td>
            </tr>
          </table>
        </div></td>
        <td width="49%"><div align="center"><b><? echo "$dados[cidade_falec]";?></b></div></td>
      </tr>
    </table>
    <a href=""></a></td>
    <td width="74" align="center"><b>
      <?=$dados[idade] ?>
    </b><strong>Anos</strong></td>
  </tr>
  <tr>
    <td height="5" colspan="7" background="images/layout/barrinha_divisao_horizontal.gif"></td>
  </tr>
  <tr>
    <td height="1" colspan="7" background="../images/layout/barrinha_divisao_horizontal.gif"></td>
  </tr>
  <tr>
    <td height="5" colspan="7"></td>
  </tr>
  <? }?>
  <tr>
    <td colspan="7"><table border="0" align="center" cellpadding="0" cellspacing="0">
      <tr>
        <td width="100" align="right" valign="top"><?
if($page > 1){
$anterior = $page -1;
$url = "?pg=$pg&page=$anterior";
echo "<a href='$url'>&laquo; Anterior</a>&nbsp;|";
} else {
echo "<font color='$corcelula2'>&laquo; Anterior</font>&nbsp;|";
}
?>        </td>
        <td align="center"><?
for($x=1; $x<=$tp; $x++){
$url = "?pg=$pg&page=$x";
  if ($x==$page) {
  echo "<font color='$coronmouse'><b>$x</b></font>|";
  } else {
  echo "<a href='$url'>$x</a>|";
  }
}
?>        </td>
        <td width="100" align="left" valign="top"><?
if($tp > $page){
$proxima = $page +1;
$url = "?pg=$pg&page=$proxima";
echo "&nbsp;<a href='$url'>Pr&oacute;xima &raquo;</a>";
} else {
echo "&nbsp;<font color='$corcelula2'>Pr&oacute;xima &raquo;</font>";
}
?>        </td>
      </tr>
    </table></td>
  </tr>
</table>
<br />
<br />
<? } else {?>
<br />
<table width="100%" cellpadding="0" cellspacing="0">
  <tr>
    <td align="center" valign="bottom"><br />
        <br />
        <br />
        <br />
        <font color="#006600"><strong>Neste m&ecirc;s n&atilde;o houve nenhum falecimento!</strong></font><br />
      <br />
      <br />
    </td>
  </tr>
</table>
<? } ?>
<br>


detalhes...


Von_Reibnitz
MEMBRO
MEMBRO
Mensagens: 27
Registrado em: Ter Jul 22, 2008 1:58 pm
Localização: SC/Caçador/Brasil

Problemas para inserir idade no banco de dados

Mensagem por web Offline » Seg Ago 17, 2009 4:58 pm

Eu usei a linha que indiquei, e foi retornado 109 anos, ou seja, a diferença entre as datas.

detalhes...

Gostou do que encontrou? Divulgue, indique, participe, agradeça pelas respostas.

Faço scripts personalizados ou reparos em scripts. Orçamento MSN codigosnaweb [@] hotmail [.] com

Avatar do usuário
web
ADMIN
ADMIN
Mensagens: 11904
Registrado em: Sáb Jan 20, 2007 6:08 pm
Localização: RJ / RJ / Brasil

Problemas para inserir idade no banco de dados

Mensagem por Von_Reibnitz Offline » Seg Ago 17, 2009 5:05 pm

Olá, o colega João Batista Neto me passou as seguintes informações:

se estivesse utilizando PHP 5.3 seria assim:

Código: Selecionar todos
$nome             = $_POST[nome];
$sobrenome        = $_POST["sobrenome"];
$sexo             = $_POST["sexo"];
$data_nasc        = "$_POST[ano]-$_POST[mes]-$_POST[dia]";
$cidade_nasc      = $_POST["cidade_nasc"];
$estado_nasc      = $_POST["estado_nasc"];
$data_falec       = "$_POST[ano2]-$_POST[mes2]-$_POST[dia2]";
$cidade_falec     = $_POST["cidade_falec"];
$estado_falec     = $_POST["estado_falec"];
$nota             = $_POST["nota"];
//A linha abaixo removemos
//$idade = floor((strtotime($data_falec) - strtotime($data_nasc))/(60*60*24*365.2425));
//E trocamos pelas duas abaixo:
$dtm = new Datetime( $data_nasc );
$idade = $dtm->diff( new Datetime( $data_falec ) )->y;


Porém como não estou utilizando ele precisaria uma função para calcular isso desta forma:

Código: Selecionar todos
/**
  * Calcula a diferença em anos entre duas datas
  * @param string $start A data inicial no formato yyyy-mm-dd
  * @param string $end A data final no formato yyyy-mm-dd
  * @return integer O número de anos
  */
function date_diff( $start , $end ){
     $mtc = array();
     $dts = 0;
     $dte = 0;
     $ret = 0;
 
     if ( preg_match( "/(\d{4})(?:\\/|-){1}(\\d{2})(?:\\/|-){1}(\\d{2})/" , $start , $mtc ) ){
         $dts = gregoriantojd( $mtc[ 2 ] , $mtc[ 3 ] , $mtc[ 1 ] );
     }
 
     if ( preg_match( "/(\d{4})(?:\\/|-){1}(\\d{2})(?:\\/|-){1}(\\d{2})/" , $end , $mtc ) ){
         $dte = gregoriantojd( $mtc[ 2 ] , $mtc[ 3 ] , $mtc[ 1 ] );
     }
 
     return( floor( ( $dte - $dts ) / 365 ) );
}

$nome             = $_POST[nome];
$sobrenome        = $_POST["sobrenome"];
$sexo             = $_POST["sexo"];
$data_nasc        = "$_POST[ano]-$_POST[mes]-$_POST[dia]";
$cidade_nasc      = $_POST["cidade_nasc"];
$estado_nasc      = $_POST["estado_nasc"];
$data_falec       = "$_POST[ano2]-$_POST[mes2]-$_POST[dia2]";
$cidade_falec     = $_POST["cidade_falec"];
$estado_falec     = $_POST["estado_falec"];
$nota             = $_POST["nota"];
//A linha abaixo removemos
//$idade = floor((strtotime($data_falec) - strtotime($data_nasc))/(60*60*24*365.2425));
//E trocamos pela linha abaixo:
$idade = date_diff( $data_nasc , $data_falec  );


Pois segundo ele:
O problema é que as funções normais do PHP trabalham com data a partir de 1 de janeiro de 1970, para conseguir fazer cálculos com datas anteriores a 1970 você precisa primeiro converter para o calendário Julian que começa em 1 de janeiro 4714 Antes de Cristo e vai até 9999 Depois de Cristo.

Utilizando a segunda opção consegui solucionar meu problema.
Agradeço a atenção dispensada

detalhes...


Von_Reibnitz
MEMBRO
MEMBRO
Mensagens: 27
Registrado em: Ter Jul 22, 2008 1:58 pm
Localização: SC/Caçador/Brasil

Problemas para inserir idade no banco de dados

Mensagem por web Offline » Seg Ago 17, 2009 5:47 pm

Blz :;)

detalhes...

Gostou do que encontrou? Divulgue, indique, participe, agradeça pelas respostas.

Faço scripts personalizados ou reparos em scripts. Orçamento MSN codigosnaweb [@] hotmail [.] com

Avatar do usuário
web
ADMIN
ADMIN
Mensagens: 11904
Registrado em: Sáb Jan 20, 2007 6:08 pm
Localização: RJ / RJ / Brasil

Problemas para inserir idade no banco de dados

Mensagem por Von_Reibnitz Offline » Qua Ago 19, 2009 3:04 pm

Só para constar, a função acima não leva em conta os anos bissextos, para que isso não ocorra deve-se alterar a linha:

Código: Selecionar todos
return( floor( ( $dte - $dts ) / 365 ) );

por:
Código: Selecionar todos
return( floor( ( $dte - $dts ) / 365.25 ) );

se isso auxiliar alguém esta uma solução que funciona.

detalhes...


Von_Reibnitz
MEMBRO
MEMBRO
Mensagens: 27
Registrado em: Ter Jul 22, 2008 1:58 pm
Localização: SC/Caçador/Brasil


responder a dúvida

Voltar para MySQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 4 visitantes