But : utiliser le champ DATETIME SQL et surtout récupérer une valeur exploitable en PHP
J'écris ce petit billet tout simplement car je vois souvent des scripts PHP traiter les dates dans des formats exotiques. Vous avez besoin de récupérer une date et une heure (ou l'un des deux) stockée dans votre base de données en PHP et vous ne savez pas comment faire ? Cette astuce est pour vous 🙂
Premièrement : utilisez le format DATETIME de SQL. Pas de INT, VARCHAR ou autre type inapproprié ! De plus utiliser ce format permet d'avoir un script universel et indépendant des langues locales configurées sur le serveur.
Deuxièmement votre date et heure seront d'autant plus facile à récupérer en PHP puisqu'ils sont stockés dans un seul et unique champ :
[sql]SELECT DATE_FORMAT(nom_du_champ, 'le %d/%m/%Y à %k:%H:%s')
AS date_heure
FROM table where [condition][/sql]
Exemple de résultat retourné : le 24/04/2008 à 9:09:07
Il vous suffit d'appliquer un explode si vous souhaitez séparer la date et l'heure, ou alors (et c'est plus simple) de faire deux sélections SQL.
Récupération de la date et de l'heure de manière séparée :
[sql]SELECT DATE_FORMAT(nom_du_champ, '%d/%m/%Y') AS ma_date,
DATE_FORMAT(nom_du_champ, '%k:%H:%s') AS mon_heure
FROM table where [condition][/sql]
En espérant que suite à ce billet vous userez correctement des différents types de champs MySQL mis à votre disposition 🙂
L'usage du timestamp(); PHP n'est pas conseillé car limité : le TimeStamp UNIX commence au 1er janvier 1970 et sera valable jusqu'en 2038 (pour l'instant sur des machines en 32bits : 2^31 = 2147483647). Si vous devez traiter des dates antérieures au 01/01/1970 : le format DATE ou DATETIME deviennent alors beaucoup plus pratique
Pour vos conversions timestamp vous pouvez utiliser cette extension firefox ou bien ce convertisseur en ligne très pratique 😉
Auteur : Mr Xhark
Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter
8 commentaires
Très pratique et utile pour afficher directement la date au format humain.
Néanmoins le titre de l'article ne colle pas avec son contenu
Le titre de l'article a été édité 😉
encore une petite erreur : Le Timestamp max correspond précisément au 19 janvier 2038 à 04:14:08 (et non 2036)
🙂
Oui tout à fait, c'est corrigé ! un site m'avait induit en erreur, mais 2^31 = 2 147 483 648, donc le timestamp maximal est bien 2^31-1 = 2147483647
J'ai au passage ajouté une petite info à la fin du billet 😉
Merci je ne connaissais pas DATE_FORMAT(). Je formate ma date à l'aide d'une regex :
preg_replace('#([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):(?:[0-9]{2})#', '$3/$2/$1 à $4h$5', $date);
Pour ma part, je confirme l'intérêt d'employer le format DATETIME ou DATE selon le contexte. Par contre je ne favorise pas la conversion au bon format à l'aide d'une requête SQL.
Les données transitant entre la base et la couche applicative doivent (selon moi, je précise) maintenir une certaine régularité, à savoir l'utilisation de formats dit "standard". PHP 5, propose plein de nouvelles classes, et entre autre la classe DateTime qui se prête parfaitement à ces conversions. Pour ainsi reprendre ton exemple, voici mon implémentation :
$date = new DateTime ('2008-04-24 09:09:07');
echo "le ".$date->format ('d/m/Y à H:i:s');
Qui affichera rigoureusement "le 24/04/2008 à 09:09:07". C'est à mon goût une solution plus élégante, et qui favorise nettement l'abstraction éventuelle de la base de donnée.
Sachant également que la classe offre d'autre possibilité comme la gestion des fuseaux horaires etc.
Chacun fera son choix mais il reste non négligeable qu'un formatage au niveau SQL permet de s'affranchir de traitements PHP en aval, surtout dans des cas simples 🙂
Je ne sais pas si MySQL 6 réserve des modifications aux niveau des dates, je ne me suis pas renseigné sur la question
Petite chose à savoir si on veut faire un tri sur les dates, il faut garder la version non converti.