Page 1 sur 2

Utilisation de DATEDIFF()

Posté : 24 mai 2012, 12:13
par ocre_rouge
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 :)

Re: Utilisation de DATEDIFF()

Posté : 24 mai 2012, 15:26
par Mazarini
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 ....');

Re: Utilisation de DATEDIFF()

Posté : 24 mai 2012, 17:27
par ocre_rouge
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.

Re: Utilisation de DATEDIFF()

Posté : 24 mai 2012, 17:54
par moogli
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. ;)



@+

Re: Utilisation de DATEDIFF()

Posté : 24 mai 2012, 17:55
par Mazarini
ne serait ce pas plutôt :
update xy set delai = datediff(x,y)

Re: Utilisation de DATEDIFF()

Posté : 24 mai 2012, 18:42
par ocre_rouge
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 !

Re: Utilisation de DATEDIFF()

Posté : 24 mai 2012, 20:00
par Mazarini
DATEDIFF(STR_TO_DATE(x, '%Y/%m/%d'),STR_TO_DATE(y, '%Y/%m/%d'))

Re: Utilisation de DATEDIFF()

Posté : 25 mai 2012, 00:08
par ocre_rouge
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".

Re: Utilisation de DATEDIFF()

Posté : 25 mai 2012, 08:08
par Mazarini
tu peux essayer TIMEDIFF(expr,expr2)

Re: Utilisation de DATEDIFF()

Posté : 25 mai 2012, 08:53
par ocre_rouge
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';}

Re: Utilisation de DATEDIFF()

Posté : 25 mai 2012, 11:13
par Mazarini
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.

Re: Utilisation de DATEDIFF()

Posté : 26 mai 2012, 09:19
par ocre_rouge
C'est noté, merci pour ce nouveau conseil. :)

Re: Utilisation de DATEDIFF()

Posté : 29 mai 2012, 22:44
par ocre_rouge
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.

Re: Utilisation de DATEDIFF()

Posté : 01 juin 2012, 11:45
par ocre_rouge
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.

Re: Utilisation de DATEDIFF()

Posté : 01 juin 2012, 15:46
par Mazarini
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'