PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 01-02-2013 06:29:45

johndoe2011
Membre
Inscription : 31-01-2013
Messages : 3

Difference pour deux dates consecutives

Bonjour,
Je suis débutant en BDD mysql mais souhaiterais avoir un peu d'aide pour une requête simple.
J'ai la base de donnée suivante:
http://imageshack.us/a/img24/8821/basedd.png

Ce que je souhaite avoir c'est une colonne (par ex nommé diff) avec la différence entre les valeurs de la colonne "value" pour la dernière date/time et celle juste avant.
Exemple :

2013-1-27 16:01:01 50393 152
2013-1-27 17:01:01 50542 149

J'ai le script actuel pour remplir la base en temps réel:


//
$ipx800v3='tablegaz'; //Table
//
//Lecture du fichier XML
$xml = read_xml("http://$usernameIPX:$passwordIPX@192.168.123.130/status.xml","response",array("day","time0","count0"));
foreach($xml as $row)
{
$day=$row[0];
$time0=$row[1];
//changement en heure locale:
$time0=date('H:i:s',gmmktime($time0));
$count0=$row[2];
}
$date=date("Y-m-d");
//
mysql_connect($host,$user,$passwd) or die("erreur de connexion au serveur $host");
mysql_select_db($db) or die("erreur de connexion à la base de données");
//
//Transfert des données de l'IPX800 V3 dans la BDD
//------------------------------------------------
$last_date=explode('-',$date);
$last_time=explode(':',$time0);
$dateXML=mktime($last_time[0],$last_time[1],0,$last_date[1],$last_date[2],$last_date[0]);
//Date du dernier enregistrement sur les entrées compteurs dans la BDD
$request="SELECT id,date,time FROM $ipx800v3 ORDER BY id DESC LIMIT 1";
$mysql_query=mysql_query($request) or die ('Erreur SQL ! '.$request.'<br/>'.mysql_error());
$last_record=mysql_fetch_array($mysql_query);
$dateDB=explode('-',$last_record[1]);
$timeDB=explode(':',$last_record[2]);
$update=1; //Mise à jour de la base toutes les 1 minutes
$date_recordDB=mktime($timeDB[0],$timeDB[1]+$update,0,$dateDB[1],$dateDB[2],$dateDB[0]);
if ($dateXML>$date_recordDB)
{
//Ecriture dans la BDD
$request="INSERT INTO $ipx800v3 VALUE('','$date','$time0','$count0')";
mysql_query($request) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
}
mysql_close();

Question :
Je souhaiterais ajouter la colonne "diff" et la remplir en temps grâce au script modifié .
Merci de votre aide pour modifier ce script/requête

Hors ligne

#2 01-02-2013 14:05:46

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Difference pour deux dates consecutives

Saluton,
Je reviens sur ton post, dont j'ai colorisé le code ce matin, mais que je n'avais pas le temps de traiter à ce moment-là.
Je crois que tu te prends la tête pour rien.
Si tu veux obtenir la différence (en fait l'écart) entre les valeurs des colonnes `time`consécutives dans la table, tu pourras toujours l'obtenir en faisant une requête qui mettra la table en jointure avec une sous-requête ramenant juste la ligne précédente (si elle existe : cas de la première ligne).
En outre, tu risques de galérer pour rendre la chose automatique.
Ce qui me semble plus désolant ce sont les noms que tu as choisis pour tes colonnes `date` et `time`qui sont des mots réservés du langage SQL.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 04-02-2013 07:06:49

johndoe2011
Membre
Inscription : 31-01-2013
Messages : 3

Re : Difference pour deux dates consecutives

Bonjour et merci pour ta réponse.
Cependant je suis novice et ne suis pas a l'origine du script que j'ai juste adapté pour mes besoins.
Quelles seraient les lignes à ajouter pour avoir les differences entre deux lignes consecutives sachant que je souhaites pouvoir avoir cette difference stockés dans la base .
Les valeurs de la colonne "time" sont renseignées par un cron qui envoie toute les heures la valeur.

Merci d'avance pour les lignes de scripts......

Cordialement

Hors ligne

#4 04-02-2013 10:02:30

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Difference pour deux dates consecutives

Sauf dans des cas très particuliers et, partant, très rares, dans la conception des bases de données relationnelles, les résultats de calcul ne sont pas définis dans les tables puisque, par définition, leurs dépendances fonctionnelles avec les autres colonnes de la tables ne respecteraient pas les formes normales.
D'autre part, pourquoi stocker l'heure et la date dans deux colonnes alors qu'un format DATETIME ou TIMESTAMP permet d'avoir l'information sur une seule colonne ?
Ces lignes sont-elles créées de façon chronologique ?
Peut-on peut envisager MAX sur la date et l'heure ? ( nouvel intérêt d'avoir une colonne en DATETIME ou TIMESTAMP )


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#5 04-02-2013 20:02:28

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Difference pour deux dates consecutives

Je me suis amusé à me faire cette petite table de test :

--
-- Base de données: `phpdeb`
--

-- --------------------------------------------------------

--
-- Structure de la table `events`
--

CREATE TABLE IF NOT EXISTS `events` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `temps` datetime NOT NULL,
  `empan` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `temps` (`temps`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ;

--
-- Contenu de la table `events`
--

INSERT INTO `events` (`id`, `temps`, `empan`) VALUES
(1, '2013-02-05 19:18:02', 0),
(2, '2013-02-05 20:18:02', 0),
(3, '2013-02-05 21:18:02', 0),
(4, '2013-02-05 22:18:02', 0),
(5, '2013-02-05 23:18:02', 0),
(6, '2013-02-06 00:18:02', 0),
(7, '2013-02-06 01:18:02', 0),
(8, '2013-02-06 02:18:02', 0),
(9, '2013-02-06 03:18:02', 0),
(10, '2013-02-06 04:18:02', 0),
(11, '2013-02-06 05:18:02', 0),
(12, '2013-02-06 06:18:02', 0),
(13, '2013-02-06 07:18:02', 0),
(14, '2013-02-06 08:18:02', 0),
(15, '2013-02-06 09:18:02', 0),
(16, '2013-02-06 10:18:02', 0),
(17, '2013-02-06 11:18:02', 0),
(18, '2013-02-06 12:18:02', 0),
(19, '2013-02-06 13:18:02', 0),
(20, '2013-02-06 14:18:02', 0);

sur laquelle j'ai appliqué cette requête

SELECT t3.id,
       t3.temps,
       MAX( t2.temps ) proche,
       t3.temps - MAX( t2.temps ) ecart
FROM EVENTS AS t3
JOIN (SELECT t1.id, t1.temps
      FROM EVENTS AS t1) AS T2
      ON t2.temps < t3.temps
GROUP BY t3.id
ORDER BY t3.id DESC
LIMIT 1

Et qui donne le résultat suivant

id Décroissant      temps                     proche                    ecart
20                  2013-02-06 14:18:02       2013-02-06 13:18:02       10000.000000

C'est ce que tu cherches à obtenir, non ?


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#6 05-02-2013 20:39:08

johndoe2011
Membre
Inscription : 31-01-2013
Messages : 3

Re : Difference pour deux dates consecutives

Merci bcp pour ta réponse. c'est super sympa !!!!!!!!
Je ne comprends pas pourquoi tu as mis des zeros dans toute les colonnes 'empan' ? Le resultat 10000.000000:

id Décroissant      temps                     proche                    ecart
20                  2013-02-06 14:18:02       2013-02-06 13:18:02       10000.000000

est bizarre ....ce devrait être ZERO ?

Je pense que c'est proche de ce que je veux faire mais au lieu des ZEROS, j'ai diverses valeurs ( qui sont renseignée par un CRON qui remplis la base heure après heure ....cela vient de capteurs) : exemple :
(1, '2013-02-05 19:18:02', 125), (2, '2013-02-05 20:18:02', 158),(3, '2013-02-05 21:18:02', 166),(4, '2013-02-05 22:18:02',181)......etc.....
donc je devrais avoir les diff:
125 - 0
158 - 125
166-158
181-166
etc......


Et j'aurai souhaité injecter le résultat dans une colonne de la même table ......ou même dans une autre table qui reprends la dernière date et l'écart .
Merci de ton aide

Dernière modification par johndoe2011 (05-02-2013 20:45:46)

Hors ligne

Pied de page des forums