Home > Mysql, PHP > Solução para problema com o limite do tipo TIME no mysql

Solução para problema com o limite do tipo TIME no mysql

Com a necessidade de somar todas as horas de uma coluna de um banco do tipo TIME resolvi procurar no google como fazer o mesmo. Cheguei então ao seguinte link : http://forum.wmonline.com.br/lofiversion/index.php/t176750.html

Nele contém um post informando que com este comando resolveria:
[code lang="php"]
mysql_query("SELECT SEC_TO_TIME( SUM( TIME_TO_SEC( nome_campo ) ) ) AS total_horas FROM nome_tabela");
[/code]

No inicio parecia que tinha resolvido mas com o passar do tempo e aumento do volume de horas cadastradas ocorreu um problema. Os campos do tipo TIME possui o limite de 838:59:59, então se a soma do total de horas da coluna ultrapassar este valor, ele sempre retorna este total que é o limite, logicamente.

Para resolver este problema resolvi fazer um script PHP que vou disponibilizar aqui pra você.

Primeiro crie uma tabela:
[code lang="php"]
CREATE TABLE `horas` (
`idhora` int(11) NOT NULL auto_increment,
`horas` time NOT NULL,
PRIMARY KEY (`idhora`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=219 ;
[/code]

Então insira dados na coluna até que a soma dos mesmos ultrapasse 838:59:59

[code lang="php"]
INSERT INTO `horas` (`idhora`, `horas`) VALUES (1, '23:59:25');
[/code]

Então teste o resultado com o script abaixo:

[code lang="php"]
<?php
# Conecta com banco
# Base: http://www.php.net/manual/pt_BR/function.mysql-fetch-array.php

mysql_connect('localhost', 'root', '') or die('Não foi possível conectar: ' . mysql_error());
mysql_select_db('temp') or die('Não foi possível conectar: ' . mysql_error());

#Faz a soma das horas e retorna em segundos em $d->total;
$sql = 'SELECT SUM(TIME_TO_SEC(horas)) AS total FROM horas';
$result = mysql_query($sql);
$d = mysql_fetch_object($result);

# Faz calculos de dias horas minutos e segundos
# Base em: http://scriptbrasil.com.br/forum/index.php?showtopic=91365
$dias = floor( $d->total / (60*60*24) );
$d->total = ($d->total % (60*60*24));
$horas = floor( $d->total / (60*60) );
$d->total = ($d->total % (60*60));
$minutos = floor($d->total / 60);
$d->total = ($d->total % 60);
$segundos = $d->total;

# Mostra o resultado na tela
print $dias.' dias '.$horas.':'.$minutos.':'.$segundos;

?>
[/code]

Fernando Binasco Mysql, PHP ,

  1. Sem comentários.
  1. No trackbacks yet.