Utilisation de DATEDIFF()

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 : Utilisation de DATEDIFF()

Re: Utilisation de DATEDIFF()

par ocre_rouge » 01 juin 2012, 17:26

Merci beaucoup, mais justement, même sous ce format, cela ne fonctionne pas.
Le problème doit venir d'ailleurs du coup. Je vais vérifier cela.

Re: Utilisation de DATEDIFF()

par Mazarini » 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'

Re: Utilisation de DATEDIFF()

par ocre_rouge » 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.

Re: Utilisation de DATEDIFF()

par ocre_rouge » 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.

Re: Utilisation de DATEDIFF()

par ocre_rouge » 26 mai 2012, 09:19

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

Re: Utilisation de DATEDIFF()

par Mazarini » 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.

Re: Utilisation de DATEDIFF()

par ocre_rouge » 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';}

Re: Utilisation de DATEDIFF()

par Mazarini » 25 mai 2012, 08:08

tu peux essayer TIMEDIFF(expr,expr2)

Re: Utilisation de DATEDIFF()

par ocre_rouge » 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".

Re: Utilisation de DATEDIFF()

par Mazarini » 24 mai 2012, 20:00

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

Re: Utilisation de DATEDIFF()

par ocre_rouge » 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 !

Re: Utilisation de DATEDIFF()

par Mazarini » 24 mai 2012, 17:55

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

Re: Utilisation de DATEDIFF()

par moogli » 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. ;)



@+

Re: Utilisation de DATEDIFF()

par ocre_rouge » 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.

Re: Utilisation de DATEDIFF()

par Mazarini » 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 ....');