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:

mysql_query("SELECT SEC_TO_TIME( SUM( TIME_TO_SEC( nome_campo ) ) ) AS total_horas FROM nome_tabela");

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:

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 ;

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

INSERT INTO `horas` (`idhora`, `horas`) VALUES (1, '23:59:25');

Então teste o resultado com o script abaixo:

<?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;

?>
Compartilhar:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • RSS
  • Twitter
  • Add to favorites
  • Diigo
  • email
  • LinkedIn
  • Live
  • Mixx
  • MySpace
  • PDF
  • Sphinn
  • StumbleUpon
  • Yahoo! Bookmarks

Tags: ,

Leave a Reply