Page 1 sur 1

Comment calculer une difference de seconde entre 2 evenement

Posté : 23 nov. 2008, 20:03
par pcca-matrix
Bonjour,
Voila j’ai un autre problème pour réaliser ceci :
Dans ma base j’ai 2 champs (date et discrete)
L’un contient la date en format text (oui je sais c’est pas bien mais j’ai pas d’autre choix cela proviens d’une bdd access)
L’autre des 0 et 1 qui corresponde à l’allumage et l’extinction d’un appareil.

Donc ca ressemble a ceci

Code : Tout sélectionner

2/10/2008 0:48:41 1 2/10/2008 0:50:38 0 2/10/2008 1:24:44 1 2/10/2008 1:26:39 0 2/10/2008 2:07:39 1 2/10/2008 2:09:32 0 2/10/2008 2:54:12 1 2/10/2008 2:56:05 0
Je doit pouvoir calculer le temps ecoulé en seconde entre un ‘1’ et un ‘0’ sur cette colonne et ensuite les additioner pour savoir le nombre de seconde totale que l’appareil est rester allumer.

Voicis le code de depart que j’utilise.
<?php
$bouton = $_POST['send'];
if(!empty($bouton)) {
 $debut = trim($_POST['debut']);
 $fin = trim($_POST['fin']);
 if(!empty($debut) && !empty($fin)) {
 echo 'Choix: '.$debut.' '.$fin.'<br>';
 }
 else {
 echo 'vous n\'avez pas rempli tous 
 les champs';
 }
}

$debut = '2/10/2008 00:00:00'; // pour test
$fin = "3/11/2008 23:55:00"; // pour test
#connect mysql
mysql_connect("localhost", "root", "");
mysql_select_db("test");
$req = mysql_query("SELECT * FROM rfxcom where STR_TO_DATE(SampleDate, '%e/%m/%Y %k:%i:%s') between STR_TO_DATE('$debut', '%e/%m/%Y %k:%i:%s') and STR_TO_DATE('$fin', '%e/%m/%Y %k:%i:%s')");
print ($req);
echo '<br>';
while ($donnees = mysql_fetch_array($req) )
{
 echo $donnees['Id'];
 echo $donnees['SampleDate'],' ';
 echo $donnees['Discrete'];
 echo '<br>';
}


mysql_close(); 

?>
Comment dois-je m’y prendre ?
Je ne parviens pas a comprendre comment faire sans si possible devoir réécrire dans la BDD

Merci

Posté : 23 nov. 2008, 22:13
par jojolapine
Je ne croit pas qu'il soit possible de faire des différence ligne à ligne en sql, mais en php ça sera possible, tu récupère toutes tes ligne, ensuite quelque chose comme
<?php
$timeTotal=0;
$timeDiff=null;
foreach($tabDonnee as $entry){
    if($entry['allumage']=='1')
        $timeDebut=strtotime($entry['date']);
    else
        $timeFin=strtotime($entry['date']);

    if($timeDiff===null){
        $timeDiff=$timeFin-$timeDebut;
        $timeTotal+=$timeDiff;
        $timeDiff=null;
    }
}
Voilà en gros l'idée, sachant que $tabDonnee contient les données que tu as récupéré de ta table...

Posté : 23 nov. 2008, 23:35
par pcca-matrix
Salut jojo ,
j'ai essayer ton code de cette maniéres mais cela ne fonctionne pas , le champs 'Discrete' et bien stocker dans le tableaux $entry mais les SampleDate eux reporte 0 comme valeur lorsque je tente de les afficher

et le total aussi forcément
mais étant debutant j'ai surement fait une erreur quelque part voicis la partie du code :
$debut = '2/10/2008 00:00:00';
$fin = "13/10/2008 23:55:00";
#connect mysql
mysql_connect("localhost", "root", "");
mysql_select_db("test");
$req = mysql_query("SELECT * FROM rfxcom where STR_TO_DATE(SampleDate, '%e/%m/%Y %k:%i:%s') between STR_TO_DATE('$debut', '%e/%m/%Y %k:%i:%s') and STR_TO_DATE('$fin', '%e/%m/%Y %k:%i:%s')");

while ($donnees = mysql_fetch_array($req))
{
$timeTotal=0;
$timeDiff=null;
foreach($donnees as $entry){
    if($entry['Discrete']=='1')
        $timeDebut=strtotime($entry['SampleDate']);
    else
        $timeFin=strtotime($entry['SampleDate']);

    if($timeDiff===null){
        $timeDiff=$timeFin-$timeDebut;
        $timeTotal+=$timeDiff;
        $timeDiff=null;
		
    }

} 
print ($donnees['SampleDate']);
echo ' '.$timeTotal;
echo '<br>';
}
mysql_close(); 
une petite chose aussi vu que mes champs de date sont en format text et non pas Date , pour les convertir avec strotime ne dois-je pas les reformatter différement ? un peu comme STR_TO_DATE en SQL ? format du style :"%e/%m/%Y %k:%i:%s"

MErci

Posté : 23 nov. 2008, 23:58
par jojolapine
Alors il ne faut pas copier/coller sans comprendre ;)
#connect mysql
mysql_connect("localhost", "root", "");
mysql_select_db("test");
$req = mysql_query("SELECT * FROM rfxcom");// j'ai viré la clause where car je croit qu'elle ne sert plus rien, vu qu'on fait le traitement en php

//il faut sortir les initialisation de la bocle while
$timeTotal=0;
$timeDiff=null;

while ($donnees = mysql_fetch_array($req))
{

    //effectivement il faut reformater un peu les champs de date
    //c'est un peu du bidouillage, il vaudrait mieux jouer avec les locales et tout ça, mais bon...
    $dateTemp=explode(' ',$donnees['SampleDate']);
    $dateTemp2=explode('/',$dateTemp[0]);
    $date=$dateTemp2[2].'-'.$dateTemp2[1].'-'.$dateTemp2[0].' '.$dateTemp[1];

    //on enlève la boucle foreach puisque le while est là pour ça
    if($donnees['Discrete']=='1')
        $timeDebut=strtotime($date);
    else
        $timeFin=strtotime($date);

    if($timeDiff===null){
        $timeDiff=$timeFin-$timeDebut;
        $timeTotal+=$timeDiff;
        $timeDiff=null;
        
    }
    echo 'temps intermédiaire:'.$timeTotal.'<br />';
}
echo 'temps total:'.$timeTotal;
mysql_close();

Posté : 24 nov. 2008, 11:56
par pcca-matrix
Magnifique !
Cela fonctionne trés trés bien mise a part qu'il fo rajouter ceci :

Code : Tout sélectionner

if($donnees['Discrete']=='1') $timeDebut=strtotime($date); else $timeDebut = $timeFin; $timeFin=strtotime($date);
Sinon le temps total reporter et du type -1222589563

Logique puisqu'1 enregistrement sur 2 a le timefin qui correspond au timedebut du precedent.
Le seul probléme est lorsque l'on tombe sur un 0 en premiere ligne :(

et je doit également laisser le WHERE du select car c'est ce qui permet lors de l'entrée du formulaire de ne selectionner dans la table que les enregistrement entre 2 dates .

Encore mille merci pour l'aide apportée ;)

Posté : 24 nov. 2008, 11:59
par jojolapine
Où sinon pour le coup tu peux juste changer la condition
    if($timeDebut<$timeFin){///içi
        $timeDiff=$timeFin-$timeDebut;
        $timeTotal+=$timeDiff;
        
    }   
Voilà ça fonctionnera mieux ;)
Pour le coup du 0, ben je peux pas faire grand chose, c'est la faute à ta base de donnée :p