Archives par étiquette : MySQL

Déterminer l’âge d’après la date de naissance

Si vous gérez une communauté en ligne, il est possible que vous ayez à afficher l’âge d’un utilisateur selon la date de naissance qu’il a fournie dans son profil. Il existe différentes solutions, mais parfois, c’est pratique d’accéder à cette information directement avec la requête MySQL :


SET @anniversaire = ‘1987-05-30’;
SELECT (SELECT EXTRACT(YEAR FROM CURRENT_DATE) – EXTRACT(YEAR FROM @anniversaire) – (CASE WHEN EXTRACT(MONTH FROM CURRENT_DATE) < EXTRACT(MONTH FROM @anniversaire) THEN 1 ELSE (CASE WHEN (EXTRACT(DAY FROM CURRENT_DATE) < EXTRACT(DAY FROM @anniversaire) AND EXTRACT(MONTH FROM CURRENT_DATE) = EXTRACT(MONTH FROM @anniversaire)) THEN 1 ELSE 0 END) END)) AS Age

Il vous faut fournir la date comme MySQL l’aime bien, c’est-à-dire sous le format YY-MM-DD.

L’exemple ci-dessus aura pour résultat l’âge qu’a aujourd’hui une personne ayant vu le jour le 30 mai 1987 (« aujourd’hui » = la date de rédaction de cet article). Nous avons utilisé SET dans l’exemple afin de simplifier les choses et ne pas avoir à aller quérir des données dans une table d’utilisateurs.

Si vous possédez, par exemple, une table appelée Utilisateurs, possédant une colonne contenant la date de naissance de chacun des utilisateurs du site (appelée Date_Anniversaire), il serait possible de formuler votre requête MySQL de cette façon :


SELECT Nom_Utilisateur, Date_Anniversaire, (SELECT EXTRACT(YEAR FROM CURRENT_DATE) – EXTRACT(YEAR FROM Date_Anniversaire) – (CASE WHEN EXTRACT(MONTH FROM CURRENT_DATE) < EXTRACT(MONTH FROM Date_Anniversaire) THEN 1 ELSE (CASE WHEN (EXTRACT(DAY FROM CURRENT_DATE) < EXTRACT(DAY FROM Date_Anniversaire) AND EXTRACT(MONTH FROM CURRENT_DATE) = EXTRACT(MONTH FROM Date_Anniversaire)) THEN 1 ELSE 0 END) END)) AS Age FROM Utilisateurs

Selon la « date d’aujourd’hui », le résultat devrait ressembler à ceci :

Nom_Utilisateur Date_Anniversaire Age
Phil14 1991-12-02 14:31:19 17
MaryJuicy03 1966-02-12 14:32:34 42
Richard23 1997-12-18 14:33:29 10