Calcul de différence par journée

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Calcul de différence par journée

Re: Calcul de différence par journée

par Sebg76 » 29 nov. 2013, 15:12

Merci beaucoup, je pensai au départ que cela était moins compliqué.
J'ai une colonne date au format aaaa:mm:jj et une colonne time au format hh:mm:ss
Je vais essayé et encore merci.

Re: Calcul de différence par journée

par orenx22 » 29 nov. 2013, 14:50

Si oui fait le !! C'est de cette manière qui te permettra de gérer les dates et pas un entier.

De cette manière tu pourras interpréter tes résultats dans un calendrier de ce type :

<?php

// page index.php

function calandar( $year )
{
    $result = array();
    
    $datetime = new DateTime( "$year-01-01", new DateTimeZone( 'Europe/Paris' ) );
    
    while( $datetime-> format( 'Y' ) == $year )
    {
        $y = $datetime-> format( 'Y' );
        $m = $datetime-> format( 'n' );
        $d = $datetime-> format( 'j' );
        $w = str_replace( '0', '7', $datetime-> format( 'w' ) );
        
        $result[$y][$m][$d] = $w ;
        
        $datetime-> add( new DateInterval( 'P1D' ) );
    }
    
    return $result ;
}

$array_days = array(
    1 => 'lundi',
    'mardi',
    'mercredi',
    'jeudi',
    'vendredi',
    'samedi',
    'dimanche'
);

$array_months = array(
    1 => 'Janvier',
    'février',
    'mars',
    'avril',
    'mai',
    'juin',
    'juillet',
    'août',
    'septembre',
    'octobre',
    'novembre',
    'décembre'
);

$year = date( "Y" );

if( isset( $_GET['year'] ) )
{
    $year = $_GET['year'];
}

$calandar = calandar( $year );

?>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Calendrier</title>
        
        <style>
            html{
                font-family: verdana;
            }
            .year{
                color: red;
                font-size: 55px;
            }
            .year a{
                text-decoration: none;
                color: red;
            }
            .year a:hover{
                color: darkred;
            }
            .year a:visited{
                color: red;
            }
            .months ul{
                margin: 0px;
                padding: 0px;
                padding-top: 10px;
                display: block;
                list-style-type: none;
            }
            .months li{
                float: left;
                padding-right: 10px;
            }
            .months a{
                color: red;
                text-decoration: none;
            }
            .months a:hover{
                color: blueviolet;
            }
            .months a:visited{
                color: red;
            }
            .month{
                padding-top: 10px;
                padding-bottom: 50px;
                clear: both;
            }
            .month table{
                border-collapse: collapse
            }
            .month td{
                border: 1px solid black;
            }
            .colspan{
                border: none;
            }
            .relative{
                height: 100px;
                width: 100px;
            }
            .day{
                text-align: center;
                font-size: 20px;
            }
        </style>
        
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
        
        <script>
            jQuery(function($){
                $('.month').hide();
                $('.month:first').show();
                $('.months a:first').addClass('active');
                var index = 1 ;
                $('.months a').click(function(){
                    var month = $(this).attr('id').replace('link-','');
                    if( month !== index ){
                        $('#month-' + index).hide();
                        $('#month-' + month).show();
                        $('.months a').removeClass('active');
                        $('.months a#link-' + month).addClass('active');
                        index = month ;
                    }
                    return false ;
                });
            });
        </script>
        
    </head>
    <body>
        <div class="calandar">
            <div class="year">
                <a href="index.php?year=<?php echo $year - 1 ?>">-</a>
                <span><?php echo $year ?></span>
                <a href="index.php?year=<?php echo $year + 1 ?>">+</a>
            </div>
            <div class="months">
                <ul>
                    <?php foreach( $array_months as $id => $month ): ?>
                    <li><a href="" id="link-<?php echo $id ?>"><?php echo $month ?></a></li>
                    <?php endforeach ?>
                </ul>
            </div>
            <?php foreach( current( $calandar ) as $m => $days ): ?>
            <div class="month" id="month-<?php echo $m ?>">
                <table>
                    <thead>
                        <tr>
                            <?php foreach( $array_days as $day ): ?>
                            <th><?php echo substr( $day, 0, 3 ) ?></th>
                            <?php endforeach ?>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                        <?php $end = end( $days ) ?>
                        <?php foreach( $days as $d => $w ): ?>
                            <?php if( $d == 1 and $w != 1 ): ?>
                            <td colspan="<?php echo $w - 1 ?>" class="colspan"></td>
                            <?php endif ?>
                            <td>
                                <div class="relative">
                                    <div class="day"><?php echo $d ?></div>
                                </div>
                            </td>
                            <?php if( $w == 7 ): ?>
                        </tr><tr>
                            <?php endif ?>
                        <?php endforeach ?>
                        <?php if( $end != 7 ): ?>
                            <td class="padding" colspan="<?php echo 7 - $end ?>"></td>
                        <?php endif ?>
                        </tr>
                    </tbody>
                </table>
            </div>
            <?php endforeach ?>
        </div>
    </body>
</html>
visuel :

Image

A partir de la tu n'as plus qu'a inscrire les résultats HC & HP dans l'année $year, le mois $month et le jour $d. D'où l'extrème utilité d'exploiter une valeur TIMESTAMP (AAAA-MM-JJ HH:MM:SS) et pas INT. Tu pourras récupérer l'année, le mois et le jour en les groupant par date avec les fonctions suivantes :

YEAR(),MONTH(),DAY(),DATE().

SELECT
    ((MAX(conso_HP) - MIN(conso_HP)) / 1000) AS conso_hp,
    ((MAX(conso-HC) - MIN(conso_HC)) / 1000) AS conso_hc ,
    YEAR(timestamp) AS annee,
    MONTH(timestamp) AS mois,
    DAY(timestamp) AS jour,
FROM calendrier
GROUP BY DATE(timestamp)
Ciao

Re: Calcul de différence par journée

par orenx22 » 29 nov. 2013, 01:49

Est ce que tu peux changer ta valeur INT de ton timestamp par une valeur TIMESTAMP (c'est à dire : aaaa-mm-jj hh:mm:ss) ?

Re: Calcul de différence par journée

par Sebg76 » 28 nov. 2013, 19:23

Avec ce code, j'affiche la consommation du jour en cours au format json

Code : Tout sélectionner

[["1385506802",22,15]]
Que dois-je faire pour réaliser la même chose pour chaque jour de consommation.
$host="localhost";
$username="root"; 
$password=""; 
$db_name="ecodevices";
$table = "infoeco";
$con=mysql_connect("$host", "$username", "$password")or die("Connexion sql refusé"); 
mysql_select_db("$db_name")or die("Connexion sql refusé");
$now = time();
$hier = mktime(0, 0, 0, date("m")  , date("d")-1, date("Y"));
$sql = "select timestp,
	((MAX(T1_HCHP) - MIN(T1_HCHP)) / 1000) AS hp, 
    ((MAX(T1_HCHC) - MIN(T1_HCHC)) / 1000) AS hc  
	from $table
	WHERE timestp BETWEEN $hier AND $now";
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
extract ($row);
$data[] = array($timestp, (int)$hp, (int)$hc);
}
echo json_encode($data);

Re: Calcul de différence par journée

par Sebg76 » 28 nov. 2013, 14:19

Dans ma table, j'ai :
une colonne timestp avec une structure(int 11)
une colonne rec_date avec une structure date
une colonne rec_time avec une structure time
une colonne T1_HCHP valeur du compteur heures pleines
une colonne T1_HCHC valeur du compteur heures creuses.
L'ensemble est mi à jour toutes les 5min.
En fait récuperer la valeur de la consommation par jour ou par date pour utiliser highstocks par la suite.
Merci.

Re: Calcul de différence par journée

par orenx22 » 28 nov. 2013, 03:16

Le système qui enregistre les watts consommé défini comment si tu es en hp ou hc ?

sinon pour ta base de donnée ton timestamp doit être un timestamp pas un int et tu peux même le mette en CURRENT_TIMESTAMP par défaut pour qu'il met automatiquement la date d'enregistrement.

Après ça tu n'as plus qu'a faire une requête sql du style :

SELECT 
    SUM(conso_HC) AS conso_HC, 
    SUM(conso_HP) As conso_HP, 
    YEAR(timestamp) AS annee, 
    MONTH(timestamp) AS mois,
    DAY(timestamp) AS jour,
    FROM table 
    WHERE timestamp BETWEEN hier AND ajourdhui
Mais je pense que la construction de ta base de donnée n'ai pas du tout bonne. C'est pour sa que j'aimerai comprendre d'où vient-elle, est-ce toi qui a décidé que les enregistrements devaient être fait de cette manière ou pas.

Sinon dans l'idée. Au lieu de chercher à savoir quel jour on était hier :P. Je ferai une chose très simple, un calendrier.

Tu es sur l'année N. Tu déclines tous les jours de l'année dans un tableau html structuré par mois et tu te place niveau lisibilité sur le jour "aujourd'hui".

Cela peut se faire très simplement avec un objet datetime. (http://www.php.net/manual/fr/class.datetime.php)

il est tard là maintenant, demain je te fait un exemple.

Ciao

Re: Calcul de différence par journée

par Sebg76 » 27 nov. 2013, 18:54

J'ai essayé ce code, j'ai un doute sur les 2 requêtes, et le timestamp hier.
<?php
$host="localhost";
$username="root"; 
$password=""; 
$db_name="ecodevices";
$table = "infoeco";
$con=mysql_connect("$host", "$username", "$password")or die("Connexion sql refusé"); 
mysql_select_db("$db_name")or die("Connexion sql refusé");
$startTime = mktime(0, 0, 0, date('m'), date('d')-1, date('Y'));
$endTime = mktime(23, 59, 59, date('m'), date('d')-1, date('Y'));
$sql = "select timestp
	from $table
	WHERE timestp >= $startime
    AND timestp <= $endTime 
    ORDER BY timestp";
$result = mysql_query($sql);
$sql = "SELECT rec_date, DATE_FORMAT(rec_date, $dateformatsql)as periode,
    ((MAX(T1_HCHP) - MIN(T1_HCHP)) / 1000) AS hp, 
    ((MAX(T1_HCHC) - MIN(T1_HCHC)) / 1000) AS hc  
    FROM $table
    WHERE timestp > $startime
    GROUP BY periode
    ORDER BY rec_date" ;
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
extract ($row);
$data[] = array($timestp, $hp, $hc);
}
echo json_encode($data);
?>
Le resultat obtenu est null.

Re: Calcul de différence par journée

par Sebg76 » 26 nov. 2013, 19:14

Après quelques essai. Je ne récupère rien.
Pour une même journée j'ai :
une date_rec identique pour toute la jounée
un timestamp min et un timestamp max de cette jounée associée à des valeurs HP mini et max du jour de cette même dat_rec.
Comment faire pour récupérer ces valeurs et faire la différence sur une journée ?
Merci

Re: Différence entre 2 valeurs

par sirakawa » 25 nov. 2013, 10:30

Quand tu consultes tu récupères le time stamp la coso HP et Hc que tu stockes en local; puis tu calcules le timestamp de J-1 ($anterieur)par la fonctin que je t'ai ndiquée et tu reconsultes ta bdd avec un where timesamp = $anterieur (ou en encadrant le time stamp de + ou - 5)

Re: Différence entre 2 valeurs

par Sebg76 » 24 nov. 2013, 23:59

Les valeurs de HC et HP sont dec(12,3) mon module téléinfo renvoie la valeur du compteur HC ou HP toutes les 5 min. En fait j'ai un cron sur mon nas qui intérroge mon module téléinfo toutes les 5 min et qui va écrire dans la sql les valeurs timestamp, rec_date, rec_time, HP, et HC.
Si je suis en HP seule les valeurs HP changent la valeur HC reste fixe et vis versa lorsque je suis en HC. Les valeurs récupérées sont du types :
timestamp : 1377617403
HP : 18530653.000
HC : 13153307.000

timestamp : 1377616802
HP : 18530560.000
HC : 13153307.000
Dans ce cas j'ai consommé 93Wh en HP, et 0 en HC comment faire pour le calculer jour/jour et a intervalle régulier de 0h00 à 23h59 et ceci pour tous les jours.

Les données sont en Wh. Le problème est de faire une consommation par 24h des HP ou HC peu importe l'heure du changement HP/HC et cela pour tous les jours.
Voici un exemplaire de ma table sql
Image
@+

Re: Différence entre 2 valeurs

par orenx22 » 24 nov. 2013, 22:52

Bonjour,

Ta base de données ne dois pas être bonne :D

Comment les heures pleines et creuses sont-elles définies ?

Est-ce des créneaux horaires ?

Par exemple entre 0h à 7h15 = heures creuses 7h16 à 0h heures pleines pour le lundi.
Un autre système pour le mardi, mercredi, etc.

J'aimerai savoir quelle mesure fait ta base de données du compteur ? Quantité de watt consommé ?

Ciao

Re: Différence entre 2 valeurs

par Sebg76 » 24 nov. 2013, 22:39

Bonjour,
:non: Ceci me donne la différence entre 2 dates.
Je me suis peut être mal exprimé.
En fait j'ai 4 colonnes dans ma sql
une colonne timestamp (int)
une colonne date_rec (yyyy-mm-dd)
une colonne HC (dec) (compteur heures creuses)
une colonne HP (dec) (compteur heures pleines)
L'ensemble est mis à jour toutes les 5 min.
Je souhaite avoir la consommation par jour en HP et HC, ceci le jour même jusqu'à 0h00 et tous les jours d'avant. Le résultat final doit être un timestamp et une valeur HP et une valeur HC par jour ou a partir de 0h00 afin de les utiliser dans un graphique highstocks.
Merci.

Re: Différence entre 2 valeurs

par sirakawa » 24 nov. 2013, 18:23

Quand j'ai vu le titre, j'ai cru à une plaisanterie. Différence entre deux dates aurait meiux valu. Enfin...
ca devrait aider:
<?PHP
$now = time();
$now_clair = date ( "d", $now  );
$jour = 86400;
$hier = $now - $jour;
$hier_clair = date ( "d", $hier  );
print "$now $now_clair; $hier $hier_clair ";
?>

Calcul de différence par journée

par Sebg76 » 23 nov. 2013, 22:46

Bonsoir,
J'ai un enregistrement régulier toutes les 5 min d'un compteur edf dans une sql avec un timestamp et la valeur de ce compteur. Je voudrais récupérer la consommation elec de chaque jour.
Je ne sais pas comment faire une différence en php entre la valeur du jour et la valeur de la veille. Le résultat final doit être la date de la veille et la consommation. Je voudrais par la suite convertir ces valeurs en json pour utiliser highchart.
Merci de votre aide.
:D