Manipulation du temps avec PHP & SQL
Une erreur de conception classique, utiliser des champs
VARCHAR pour stocker des timestamp PHP dans une table SQL.
Les champ de type TIMESTAMP sont fait pour ça, ils stockent la date au format
AAAA-MM-JJ HH:MM:SS, le
TIMESTAMP qu'il est alors que j'écris ces lignes est 2007-11-27 07:26:54 !
Ces valeurs sont bien plus lisibles et surtout, bien plus pratique à utiliser ! On peut facilement les mettre en valeur par défaut d'un champ, et le
TIMESTAMP est alors généré automatiquement par SQL lors de l'enregistrement d'une entrée dans la table : rien à gérer côté PHP !
On peut s'en servir pour formater une date directement avec SQL, à l'aide de la fonction SQL
DATE_FORMAT(date, format), qui s'utilise de cette manière :
Cette requête renvoie le nom (champ :
nom) et la date d'inscription (nom du champ :
date_inscription) de chaque joueur, on ne renvoie ici que le jour, le mois et l'année d'inscription, car le reste n'est pas nécessaire :
Code PHP :
mysql_query("SELECT nom, DATE_FORMAT(date_inscription, '%d/%m/%Y') AS date_inscription FROM comptes;");
// Renverra les dates au format JJ/MM/AAAA
Si j'avais voulu renvoyer le moment de l'inscription à la minute près et dans une
jolie chaîne de caractères, j'aurais fais :
Code PHP :
mysql_query("SELECT nom, DATE_FORMAT(date_inscription, 'le membre s\'est inscrit le %d %m %Y à %Hh%i.') AS inscription_date FROM comptes;")
On trouvera les correspondances sur
PHPFrance - Formater une date par exemple.
Les TIMESTAMP sont plus pratique à utiliser pour les fonctions de dates.
Par exemple, si je veux effacer les messages d'une table et qui ont été crées il y à 5 jours ou plus :
Code PHP :
mysql_query("DELETE FROM messages WHERE creation_date < DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 5 DAY)");
À voir :
Manipulation des temps, parce qu'il y a des confusion à éclaircir :
- mktime() sert à créer un timestamp à partir de paramètres, si tu ne veux lui passer aucun paramètre autant appeler time().
- MySQL travaille à la précision donnée par le type du champ, un type TIMESTAMP est à la seconde près, donc "DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 5 DAY)" c'est 5 jours avant, à la seconde près.
- Quand on fait des requêtes, l'idée générale est de déléguer le maximum de traitements au serveur SQL, donc c'est une bonne chose de lui faire gérer les traitements de date directement.
- Il y a strtotime() qui existe et qui est diablement pratique, plutôt que de faire "time()-432000" on peut faire "strtotime('-5 DAYS')"
Remerciements à Sephi-Chan & naholyr