Utilisation de DATEDIFF()

Eléphanteau du PHP | 23 Messages

24 mai 2012, 12:13

Bonjour,

Je suis à la recherche d'un tutoriel détaillant l'utilisation de DATEDIFF().
Pour le moment j'ai réalisé les étapes suivantes :
1. Création d'un table au sein d'une base sql :
CREATE TABLE IF NOT EXISTS xy (cle INT(5) AUTO_INCREMENT PRIMARY KEY, Date_x CHAR(10), Date_y CHAR(10), Delai DATE)
2. Insertion de donées issues d'un formulaire :
INSERT INTO xy (x,y) VALUES('$_POST['x']','$_POST['y']')
Étape pour laquelle je bloque :
	$Delai = $bdd->query("SELECT DATEDIFF 'x','y' FROM xy");
	$bdd->query("INSERT INTO xy(Delai) VALUES ($Delai)");
à ce moment, le message suivant apparait :

Code : Tout sélectionner

Erreur : SQLSTATE[42S22]: Column not found: 1054 Unknown column 'DATEDIFF' in 'field list'
J'ai cherché un peu sur les sites suivants :
http://dev.mysql.com/doc/refman/5.0/fr/ ... tions.html
http://dev.mysql.com/doc/refman/5.0/fr/ ... tions.html
http://blogs.codes-sources.com/christia ... dates.aspx
Mais ne suis toujours pas en mesure de solutionner le probleme.

Par avance, je vous remercie :)

ViPHP
ViPHP | 2577 Messages

24 mai 2012, 15:26

il faut écrire DATEDIFF(x,y) car c'est une fonction.

Autrement, il faut également faire un mysql_fetch() pour avoir les données retournées par un mysql_query('select ....');

Eléphanteau du PHP | 23 Messages

24 mai 2012, 17:27

Merci !

Effectivement, je me suis trompé.
Il faudrait plutôt quelque chose comme :
INSERT INTO xy (Delai) VALUES DATEDIFF(x,y)
Mais cette syntaxe n'est pas acceptée.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 mai 2012, 17:54

Normal elle n'est pas correcte. Il faut que les valeurs soit "entourées" par des parenthèses et ce n'est pas le cas.
D'ailleurs tu doit avoir un message d'erreur qui te l'indique. ;)



@+
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 2577 Messages

24 mai 2012, 17:55

ne serait ce pas plutôt :
update xy set delai = datediff(x,y)

Eléphanteau du PHP | 23 Messages

24 mai 2012, 18:42

Merci à vous :)
En utilisant
UPDATE xy SET delai = datediff(x,y)
plus de message d'erreur.

Par contre, le champs de la colonne Delai, conserve la valeur 'NULL'.
Mais pour le coup peut être s'agit-t-il d'une erreur d'interpretation de la date pour les variables x et y.

Edit : effectivement, cela semble en partie du à une mauvaise interpretation de la date, car :
UPDATE xy SET Delai = DATEDIFF('2008-11-30','2008-10-29')
renvoie '0000-00-00' dans le cas où les variables de Delai sont de type 'date'.
Et '32' dans le cas où les variables de Delai sont de type 'INT(10)'.

Plus qu'à faire en sorte que les dates soient correctement acceptées en passant par un formulaire.

Merci !

ViPHP
ViPHP | 2577 Messages

24 mai 2012, 20:00

DATEDIFF(STR_TO_DATE(x, '%Y/%m/%d'),STR_TO_DATE(y, '%Y/%m/%d'))

Eléphanteau du PHP | 23 Messages

25 mai 2012, 00:08

Une nouvelle fois, merci beaucoup Mazarini.
DATEDIFF ne semble pas prévu pour les heures par contre :
UPDATE xy SET Delai_heure = DATEDIFF(STR_TO_DATE(x_Heure, '%H:%i:%s'),STR_TO_DATE(y_heure, '%T'))
renvoit Null.
(j'ai volontairement laissé deux 'specifiers' différents, mais cela ne change rien même lorsqu'ils sont semblables)

Ce qui est dû, d'après la documentation officielle à une valeur extraite illégale :
"If the date, time, or datetime value extracted from str is illegal, STR_TO_DATE() returns NULL and produces a warning".

ViPHP
ViPHP | 2577 Messages

25 mai 2012, 08:08

tu peux essayer TIMEDIFF(expr,expr2)

Eléphanteau du PHP | 23 Messages

25 mai 2012, 08:53

Excellent, merci beaucoup.
C'était juste un peu plus bas dans la doc #-o.

Edit : pour récupérer la valeur d'un TIMEDIFF, le mieux est encore TIME.
Edit 2 : ensuite, par contre, pour pouvoir être interprété correctement en PHP, le délai horaire doit être comparé à partir de la fonction date.
Exemple :
	echo 'Délai :'.$infos['Delai_heure'];
	if ($infos['x_heure']>=date('00:16:00')) {
		echo 'long';
	}
	else {
	echo 'court';}

ViPHP
ViPHP | 2577 Messages

25 mai 2012, 11:13

En général pour les nombres à virgule et les dates il faut ecrire des functions PHP de conversion pour se préoccuper du problème une seule fois.

Un couple pour formatage PHP => mySQL et mySQL => PHP
de même :
Un couple pour formatage PHP => HTML et HTML => PHP

PHP => mySQL : mettre une variable type date PHP au format AAAA-MM-JJ pour un ordre SQL
mySQL => PHP : mettre une date AAAA-MM-JJ au format date de PHP
PHP => HTML : mettre une date au format JJ/MM/AAAA
HTML => PHP : traduire une date saisie dans un format de type date PHP

L'intéret de ce genre de fonction est de se poser qu'une seule fois la question sur les formats qui peuvent varier suivant le pays ou le paramétrage de la base de données.

Eléphanteau du PHP | 23 Messages

26 mai 2012, 09:19

C'est noté, merci pour ce nouveau conseil. :)

Eléphanteau du PHP | 23 Messages

29 mai 2012, 22:44

Bonsoir,

Désolé pour la réouverture de ce sujet.
Je ne parviens pas à travailler avec des asssociations de dates et d'heure en SQL.
En PHP, j'ai procédé ainsi :
$debut=date($datedebut.' '.$heuredebut);
$fin=date($datefin.' '.$heurefin);
Et en SQL, ainsi :
CREATE TABLE IF NOT EXISTS intervals (cle INT(5) AUTO_INCREMENT PRIMARY KEY, Datedebut DATE, Datefin DATE, Heuredebut TIME , Heurefin TIME , Debut DATETIME, Fin DATETIME, Delai CHAR);
INSERT INTO intervals (DateDebut,DateFin,HeureDebut,HeureFin,Debut,Fin) VALUES('$datedebut','$datefin','$heuredebut','$heurefin','$debut','$fin');
UPDATE intervals SET Delai = DATEDIFF(STR_TO_DATE(Fin, '%d/%m/%Y'),STR_TO_DATE(Debut, '%d/%m/%Y'));
Tous les champs se remplissent correctement à l'exception de celui de la colonne 'Delai', qui elle reste à NULL.

Eléphanteau du PHP | 23 Messages

01 juin 2012, 11:45

Bonjour,

Je me permets ce nouveau retour.
Je pense que le problème se situe au niveau de l'interpréatation des 'tirets' et des 'deux points' par SQL.
Car même avec une fonction de type :
function amj ($donnee)
{
return date("Y:m:d", strtotime($donnee));
}
La base transformera elle-même la date sous ce format :
%Y-%m-%d %H:%i:%s
.
Or pour que le TIMEDIFF fonctionne, il faut apparemment que la date soit formatée ainsi :
%Y:%m:%d %H:%i:%s
Du coup, je ne vois pas comment obtenir un TIMEDIFF fonctionnel avec une date complète.
D'autant que même lorsque cela fonctionne (par exemple en entrant manuellement les deux dates), le résultat m'est difficilement exploitable.

Il semble exister une alternative, mais elle complique encore un peu plus le traitement du résultat.

ViPHP
ViPHP | 2577 Messages

01 juin 2012, 15:46

Exemple de la doc : http://dev.mysql.com/doc/refman/5.5/en/ ... tions.html
mysql> SELECT TIMEDIFF('2008-12-31 23:59:59.000001',
-> '2008-12-30 01:01:01.000002');
-> '46:58:57.999999'