Fonctions de date/heure en MySQL


précédentsommaire

4. Bêtisier : les erreurs à ne pas faire

Cette section illustre les erreurs à ne PAS faire.

J'ai préféré faire une section à part, de manière à séparer clairement les exemples "corrects" de ceux à ne pas reproduire.

J'ai ajouté cette section non pas pour me moquer, mais pour :

  • illustrer certaines erreurs courantes avec les fonctions de date
  • comprendre comment MySQL évalue les résultats renvoyés par les fonctions de date/heure
  • vous mettre en garde sur les choses à ne pas faire

Par ailleurs, comme le dit le proverbe :

"L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres."



Je tiens à remercier toutes les personnes qui, par leurs erreurs, ont contribué à enrichir cette section, et dont je tairai les noms...

Erreur d'ajout de temps

Enoncé du problème

Un utilisateur cherche à mettre à jour un champ date en ajoutant un certain nombre de minutes à la date courante. Voici la requête qu'il utilise :

NE PAS REPRODUIRE !
Sélectionnez

UPDATE unetable
SET unedate=NOW()+120

L'utilisateur pense ainsi ajouter 2 minutes (120 s) à la date courante, mais cela lui retourne la date 0000-00-00 00:00:00 à la place.

Origine de l'erreur

Au lieu d'ajouter 2 minutes, on va chercher à ajouter 2 heures (7200 s). A titre de comparaison, on va aussi mettre l'heure actuelle. La requête effectuée est la suivante :

 
Sélectionnez

SELECT NOW(), NOW()+7200

Et voici le résultat renvoyé :

 
Sélectionnez

       NOW()        |   NOW()+7200
-------------------------------------
2006-01-01 16:01:28 | 20060101167328

Comme on peut le constater, NOW()+7200 renvoie la date "2006-01-01 16:73:28", qui n'est pas une date correcte !

En fait, voilà ce qu'il se passe: NOW() renvoie une date, convertie en entier dans le format YYYYMMDDHHMMSS. Quand on fait l'addition, cela peut renvoyer un chiffre qui correspond à une date invalide et sera évaluée en 0000-00-00 00:00:00 (avec 7200, la date est toujours invalide. Avec 120, ça dépend de l'heure à laquelle on lance la requête !)

Pour faire un ajout d'intervalle de temps, il faut donc SYSTEMATIQUEMENT utiliser les fonctions prévues à cet effet (ou à défaut, les solutions prévues dans la section Rétrocompatibilité).


précédentsommaire

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2006 Pierre Caboche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.