Array
(
)

Somando campo datetime em um foreach

João Vitor
   - 05 fev 2015

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:
#Código<?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 {main} thrown in C:\xampp\htdocs\sistemas\forms.php on line 417
e quando faço deste modo:
#Código$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 !!!

Ronaldo Lanhellas
   - 05 fev 2015

Tente assim:

#Código
$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++;
}

Ronaldo Lanhellas
   - 05 fev 2015

Tente assim:

#Código
$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++;
}

João Vitor
   - 09 fev 2015

Bom dia

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

#Códigofunction 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!