Valeur max d'un champ sur 24h avec date

Eléphanteau du PHP | 19 Messages

16 déc. 2013, 23:00

Bonjour,
J'ai 3 colonnes ffeed, ftimestamp et fvalue.
Je relève toutes les 20 min le nom de la sonde (dans la colonne ffeed), le timestamp (dans la colonne ftimestamp) et la valeur (dans la colonne fvalue) de la température. Au total j'ai trois sondes (T_Ext, T_Int, T_Souf).
Je souhaite récupérer la valeur max de la T_Ext avec son heure des dernières 24h. Voici mon code qui ne fonctionne pas !!
$now = time();
$jour = 86400;
$pmois = 2592000;
$encours = $now-$jour;
$mois = $now-$pmois;
$sql = "SELECT ftimestamp as date1,
		fvalue as textmax
		FROM $table
		WHERE fvalue = (SELECT MAX(fvalue) FROM $table WHERE ftimestamp BETWEEN $encours AND $now)
		AND (ffeed = 'T_Ext')";
Besoin d'aide pour essayer de résoudre le problème.

Eléphanteau du PHP | 19 Messages

17 déc. 2013, 10:08

Avec ce code je récupère la valeur max de la température ext mais pas la bonne heure de la valeur max !
$sql1 = "SELECT ftimestamp AS date1,
		MAX(fvalue) as text
		FROM $table
		WHERE ffeed = 'T_Ext' BETWEEN $encours AND $now";

ViPHP
ViPHP | 2577 Messages

17 déc. 2013, 10:40

Avec ce code tu récupères effectivement une date au hasard, ce qui est normal. D'autres SGBD n'exécuterai pas la requête et retournerai un mésage d'erreur/

Pour comprendre l'erreur :
SELECT ftimestamp AS date1,
                MAX(fvalue) as text,
                MIN(fvalue) as text
                FROM $table
                WHERE ffeed = 'T_Ext' BETWEEN $encours AND $now;
Devrait on mettre la date du max ou du min ?

La solution serait dans ton cas :
SELECT ftimestamp AS date1,
                fvalue as text
                FROM $table
                WHERE ffeed = 'T_Ext' BETWEEN $encours AND $now
                order by fvalue DESC
                limit 1 

Eléphanteau du PHP | 19 Messages

17 déc. 2013, 14:41

Après un essai avec le nouveau code, la date et l'heure ne correspond pas à la valeur max.
J'ai un doute sur $mois. ftimestamp est du type datetime (yyyy mm dd hh:mm:ss) current timestamp dans ma sql. Pour mon calcul sur les dernières 24h je considère mon ftimestamp comme un timestamp unix. ftimestamp est-il formater en timestamp unix automatiquement ? Si non comment faire ? En fait, je viens de m'apercevoir que je récupère la valeur max et min de la colonne complète et non des dernières 24h. Donc il y a une erreur sur les dates.
$now = time();
$jour = 86400;
$pmois = 2592000;
$encours = $now-$jour;
$mois = $now-$pmois;
$sql1 = "SELECT ftimestamp AS date1,
                fvalue AS textmax
                FROM $table
                WHERE ffeed = 'T_Ext' BETWEEN $encours AND $now
                ORDER BY fvalue DESC
                LIMIT 1";
#-o

ViPHP
ViPHP | 2577 Messages

17 déc. 2013, 15:46

Je me suis focalisé sur le problème entre la date et le max().
Commence par faire le test sans la ligne where pour séparer les problèmes.

Je jette un oeil sur le problème de date

Edit : where now() < timestamp(ftimestamp, '24:00:00')

Eléphanteau du PHP | 19 Messages

17 déc. 2013, 18:26

Avec cette solution cela fonctionne :
$sql1 = "SELECT UNIX_TIMESTAMP(ftimestamp) as date1,
			fvalue AS textmax
			FROM  $table
			WHERE fvalue=(SELECT MAX(fvalue) FROM $table WHERE UNIX_TIMESTAMP(ftimestamp) BETWEEN $encours AND $now) AND ffeed = 'T_Ext'";

ViPHP
ViPHP | 2577 Messages

18 déc. 2013, 12:21

Normalement, ca devrait marcher :
SELECT UNIX_TIMESTAMP(ftimestamp) AS date1,
                fvalue AS textmax
                FROM $table
                WHERE UNIX_TIMESTAMP(ftimestamp) BETWEEN $encours AND $now) AND ffeed = 'T_Ext'
                ORDER BY fvalue DESC
                LIMIT 1;
Ta solution ne marche pas si la valeur max se retrouve plusieurs fois, surtout si une des fois est en dehors des 24h

Eléphanteau du PHP | 19 Messages

23 déc. 2013, 22:17

En effet cela a fonctionné pendant 2 jours et sur certaines valeurs, j'avais des erreurs.
Ton code fonctionne correctement.
Merci.
:D