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.
Realmente, resolveu meu problema!
Muito bom os códigos.
Deixando a minha dica também.
No SqlServer existe uma função para somar datas chamada DATEADD e no Firebird também é chamada deste feito.
Valeuuuuu.
No SQL Server existem funções específicas como o DATEADD e DATEDIFF, no MYSQL a função que facilita isto, só em versões superiores a 5. Valeu.