Somando campo datetime em um foreach

05/02/2015

0

Boa Tarde Pessoal,

estou finalizando um projeto em php e estou com um problema, eu tenho gravado no banco de dados os campos "datainicial","datafinal', e "datatotal", todos dão campos datetime
na página onde eu estou com problemas eu estou listando todos os registros com um foreach e eu quero somar todos os valores de tempo da "datatotal" segue abaixo o exemplo de como eu estou fazendo:

<?php
					   include 'includes/database.php';
					   $pdo = Database::connect();
						$sql = "SELECT * FROM linha_dir";
						foreach($pdo->query($sql)as $row){
							echo '<tr>';
							echo '<td>'.$row['desct'].'</td>';
							echo '<td>'.$row['solic'].'</td>';
							echo '<td>'.$row['dtini'].'</td>';
							echo '<td>'.$row['dtfnl'].'</td>';
							echo '<td>'.$row['ttotal'].'</td>';
							echo '<td>'.$row['status'].'</td>';
							echo '</tr>';
							$date = new DateTime('0000-00-00 00:00:00');
							$datat = new DateInterval($row['ttotal']);
							$date->add($datat);
						}
						Database::disconnect();
						echo '<tr>';
							echo '<th colspan = 4>Total :</th>';
							echo '<td>';
							echo $date->format('Y-m-d H:i:s') . "\n";
							echo '</td>';
							echo '<td></td>';						
						echo '</tr>';

e está aparecendo o seguinte erro:

Fatal error: Uncaught exception 'Exception' with message 'DateInterval::__construct(): Unknown or bad format (0000-00-00 00:31:00)' in C:\xampp\htdocs\sistemas\forms.php:417 Stack trace: #0 C:\xampp\htdocs\sistemas\forms.php(417): DateInterval->__construct('0000-00-00 00:3...') #1 thrown in C:\xampp\htdocs\sistemas\forms.php on line 417

e quando faço deste modo:

$date = new DateTime('0000-00-00 00:00:00');
	$datat = new DateTime($row['ttotal']);
	$date->add($datat);


e aparece o erro:
Warning: DateTime::add() expects parameter 1 to be DateInterval, object given in C:\xampp\htdocs\sistemas\forms.php on line 418

Alguém pode me dar um dica, ou alguém sabe que problema pode estar acontecendo? Valeu !!!
João Vitor

João Vitor

Responder

Posts

05/02/2015

Ronaldo Lanhellas

Tente assim:

 $cont = 0;
foreach($pdo->query($sql)as $row){
 if ($cont == 0){
   $date = new DateTime($row['ttotal']);
}
                            echo '<tr>';
                            echo '<td>'.$row['desct'].'</td>';
                            echo '<td>'.$row['solic'].'</td>';
                            echo '<td>'.$row['dtini'].'</td>';
                            echo '<td>'.$row['dtfnl'].'</td>';
                            echo '<td>'.$row['ttotal'].'</td>';
                            echo '<td>'.$row['status'].'</td>';
                            echo '</tr>';
                            $datat = new DateInterval($row['ttotal']);
                            $date->add($datat);
$cont++;
                        }
Responder

05/02/2015

Ronaldo Lanhellas

Tente assim:

 $cont = 0;
foreach($pdo->query($sql)as $row){
 if ($cont == 0){
   $date = new DateTime($row['ttotal']);
}
                            echo '<tr>';
                            echo '<td>'.$row['desct'].'</td>';
                            echo '<td>'.$row['solic'].'</td>';
                            echo '<td>'.$row['dtini'].'</td>';
                            echo '<td>'.$row['dtfnl'].'</td>';
                            echo '<td>'.$row['ttotal'].'</td>';
                            echo '<td>'.$row['status'].'</td>';
                            echo '</tr>';
                            $datat = new DateInterval($row['ttotal']);
                            $date->add($datat);
$cont++;
                        }
Responder

09/02/2015

João Vitor

Bom dia

Ronaldo desse jeito não deu certo data erro relacionado ao date interval, então consegui fazer com essa função aqui:

function somaHora($arrayHora)
  {
    $segundos = 0;

    foreach ( $arrayHora as $tempo )
    {
        list( $g, $i, $s ) = explode( ':', $tempo );
        $segundos += $g * 3600;
        $segundos += $i * 60;
        $segundos += $s;
    }
						
        $horas = floor( $segundos / 3600 );
        $segundos -= $horas * 3600;
        $minutos = floor( $segundos / 60 );
        $segundos -= $minutos * 60;
						
        if(intval($horas) < 10)
        {
        $horas = "0".$horas;
        }
						
        if(intval($minutos) < 10)
        {
        $minutos = "0".$minutos;
        }
						
        return "{$horas}:{$minutos}";
						
        }





include 'includes/database.php';
$pdo = Database::connect();
$sql = "SELECT * FROM linha_dir";
$i = 0;
foreach($pdo->query($sql)as $row){
        $horaTotal = $row['ttotal'];
							
        echo '<tr>';
        echo '<td>'.$row['desct'].'</td>';
        echo '<td>'.$row['solic'].'</td>';
        echo '<td>'.$row['dtini'].'</td>';
        echo '<td>'.$row['dtfnl'].'</td>';
        echo '<td>'.$row['ttotal'].'</td>';
        echo '<td>'.$row['status'].'</td>';
        echo '</tr>';
							
        $arrayHora[$i] = $horaTotal;
        $i++;
        }
						
        Database::disconnect();
        echo '<tr>';
        echo '<th colspan = 4>Total :</th>';
        echo '<td>';
        echo somaHora($arrayHora);
        echo '</td>';


Só que acontece um único problema nela que é o seguinte, ele faze a conta certinha no grid, mas quando tem hora cheia ele não converte só os minutos.

exemplo:

Data 1 = 0000-00-00 00:50:00
Data 2 = 0000-00-00 00:20:00
Data 3 = 0000-00-00 01:00:00

o Resultado sai : 01:10
e deveria sair 02:10

outro exemplo é esse :

Data 1 = 0000-00-00 00:38:00
Data 2 = 0000-00-00 00:06:00
Data 3 = 0000-00-00 01:06:00

e ele retorna : 00:50

e era para retornar 01:50

Tem alguma dica? Valeuu!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar