Somando horas no PHP e no MySQL

Somando horas no PHP e no MySQL

Bom dia!

Estou trabalhando em projetos para a minha empresa Ethos Consultores incluindo um auditor de planos coorporativos de celulares.

Como é necessário somar horas, minutos e segundos, e como é complexo achar funções que funcionem perfeitamente, resolvi disponibilizar os dois códigos fontes, um para somar as horas via MySQL e outro para somar dentro de um arquivo PHP.

Abaixo a função em PHP:

$times = array(
'01:30:22',
'34:17:03',
);
$seconds = 0;

foreach ( $times as $time ){
list( $g, $i, $s ) = explode( ':', $time );
$seconds += $g * 3600;
$seconds += $i * 60;
$seconds += $s;
}
$hours = floor( $seconds / 3600 );
$seconds -= $hours * 3600;
$minutes = floor( $seconds / 60 );
$seconds -= $minutes * 60;
echo "{$hours}:{$minutes}:{$seconds}";

Fonte:  This.Garota

Abaixo o código para somar em MySQL

SELECT sec_to_time(sum(time_to_sec(right(duracao,8)))) AS DURACAO FROM tabela

Existe mais um detalhe, calcular a diferença entre campos DATETIME, no MySQL versão 5 existe o DATEDIFF, mas para versões anteriores segue uma função em PHP

function formata($mins) {
#
// Se os minutos estiverem negativos


if ($mins < 0)
$min = abs($mins);

else

$min = $mins;
// Arredonda a hora
$h = floor($min / 60);
$m = ($min - ($h * 60)) / 100;
$horas = $h + $m;
// Matemática da quinta série
// Detalhe: Aqui também pode se usar o abs()
>if ($mins < 0)
$horas *= -1;
// Separa a hora dos minutos
$sep = explode('.', $horas);
$h = $sep[0];

if (empty($sep[1]))
$sep[1] = 00;
$m = $sep[1];
// Aqui um pequeno artifício pra colocar um zero no final

>if (strlen($m) < 2)
$m = $m . 0;

return sprintf('%02d:%02d', $h, $m);
}
function Diferenca($data1, $data2="",$tipo=""){

if($data2==""){
$data2 = date("d/m/Y H:i");
}
if($tipo==""){
$tipo = "h";
}

for($i=1;$i<=2;$i++){
${"dia".$i} = substr(${"data".$i},0,2);
${"mes".$i} = substr(${"data".$i},3,2);
${"ano".$i} = substr(${"data".$i},6,4);
${"horas".$i} = substr(${"data".$i},11,2);
${"minutos".$i} = substr(${"data".$i},14,2);
}
$segundos = mktime($horas2,$minutos2,0,$mes2,$dia2,$ano2) - mktime($horas1,$minutos1,0,$mes1,$dia1,$ano1);

switch($tipo){

case "m": $difere = $segundos/60;    break;

case "H": $difere = $segundos/3600;    break;

case "h": $difere = round($segundos/3600);    break;

case "D": $difere = $segundos/86400;    break;

case "d": $difere = round($segundos/86400);    break;
}

return $difere;
}

Fonte: Não lembro ;-D, mas eu mesmo modifiquei

Para usar a função acima, utilize

echo formata(Diferenca($data1,$data2,"m"));

Bom, é isto, essas informações são bastante úteis para quem precisa mexer com tempos e datas que geram problemas.

Sobre o Autor

Daniel Carvalho é um entusiasta da tecnologia, especialista em TI e MBA em Gerência de Projetos. É atualmente sócio-consultor da Ethos Consultores Ltda em Minas Gerais.