MySQL fournit plusieurs fonctions que vous pouvez utiliser pour effectuer des calculs sur les dates, par exemple, pour calculer l'âge ou pour extraire des parties de date.
Pour déterminer quel âge a chacun de vos animaux, vous devez calculer la différence entre l'année en cours et l'année de naissance, puis soustraire à la date courante si la date du jour se produit plus tôt dans l'année civile que la date de naissance. La requête suivante montre, pour chaque animal, la date de naissance, la date courante, ainsi que l'âge en années.
mysql>SELECT nom, naissance, CURRENT_DATE,
->(YEAR(CURRENT_DATE)-YEAR(naissance))
->- (RIGHT(CURRENT_DATE,5)<RIGHT(naissance,5))
->AS age
->FROM animal;
+----------+------------+--------------+------+ | nom |naissance | CURRENT_DATE | age | +----------+------------+--------------+------+ | Fluffy | 1993-02-04 | 2001-08-29 | 8 | | Claws | 1994-03-17 | 2001-08-29 | 7 | | Buffy | 1989-05-13 | 2001-08-29 | 12 | | Fang | 1990-08-27 | 2001-08-29 | 11 | | Bowser | 1989-08-31 | 2001-08-29 | 11 | | Chirpy | 1998-09-11 | 2001-08-29 | 2 | | Whistler | 1997-12-09 | 2001-08-29 | 3 | | Slim | 1996-04-29 | 2001-08-29 | 5 | | Puffball | 1999-03-30 | 2001-08-29 | 2 | +----------+------------+--------------+------+
Ici, YEAR()
extrait l'année de la date et
RIGHT()
extrait les 5 caractères les plus
à droite de la date qui représentent
MM-DD
(année civile). La partie de
l'expression qui compare les valeurs de
MM-DD
évalue à 1 ou à 0, qui ajustent la
différence d'année à la baisse, si
CURRENT_DATE
se produit plus au début de
l'année que la naissance
. L'expression
complète est un peu plus fine en utilisant un alias
(age
) pour produire un nom de colonne un
peu plus significatif.
La requête fonctionne, mais le résultat pourrait être lu
plus facilement si les lignes étaient présentées dans le
même ordre. Cela peut être obtenu en ajoutant une clause
ORDER BY nom
pour trier le résultat par
nom :
mysql>SELECT nom, naissance, CURRENT_DATE,
->(YEAR(CURRENT_DATE)-YEAR(naissance))
->- (RIGHT(CURRENT_DATE,5)<RIGHT(naissance,5))
->AS age
->FROM animal ORDER BY nom;
+----------+------------+--------------+------+ | nom |naissance | CURRENT_DATE | age | +----------+------------+--------------+------+ | Bowser | 1989-08-31 | 2001-08-29 | 11 | | Buffy | 1989-05-13 | 2001-08-29 | 12 | | Chirpy | 1998-09-11 | 2001-08-29 | 2 | | Claws | 1994-03-17 | 2001-08-29 | 7 | | Fang | 1990-08-27 | 2001-08-29 | 11 | | Fluffy | 1993-02-04 | 2001-08-29 | 8 | | Puffball | 1999-03-30 | 2001-08-29 | 2 | | Slim | 1996-04-29 | 2001-08-29 | 5 | | Whistler | 1997-12-09 | 2001-08-29 | 3 | +----------+------------+--------------+------+
Pour trier le résultat par l'age
plutôt
que par le nom
, utilisez simplement une
clause ORDER BY
différente :
mysql>SELECT nom, naissance, CURRENT_DATE,
->(YEAR(CURRENT_DATE)-YEAR(naissance))
->- (RIGHT(CURRENT_DATE,5)<RIGHT(naissance,5))
->AS age
->FROM animal ORDER BY age;
+----------+------------+--------------+------+ | nom |naissance | CURRENT_DATE | age | +----------+------------+--------------+------+ | Chirpy | 1998-09-11 | 2001-08-29 | 2 | | Puffball | 1999-03-30 | 2001-08-29 | 2 | | Whistler | 1997-12-09 | 2001-08-29 | 3 | | Slim | 1996-04-29 | 2001-08-29 | 5 | | Claws | 1994-03-17 | 2001-08-29 | 7 | | Fluffy | 1993-02-04 | 2001-08-29 | 8 | | Fang | 1990-08-27 | 2001-08-29 | 11 | | Bowser | 1989-08-31 | 2001-08-29 | 11 | | Buffy | 1989-05-13 | 2001-08-29 | 12 | +----------+------------+--------------+------+
Une requête similaire peut être utilisée pour déterminer
l'âge qu'avait un animal à sa mort. Vous determinez les
animaux qui le sont en regardant les valeurs
mort
qui ne valent pas
NULL
. Alors, pour ceux dont la valeur est
non NULL
, calculez la différence entre la
mort
et la naissance
:
mysql>SELECT nom, naissance, mort,
->(YEAR(mort)-YEAR(naissance)) - (RIGHT(mort,5)<RIGHT(naissance,5))
->AS age
->FROM animal WHERE mort IS NOT NULL ORDER BY age;
+--------+------------+------------+------+ | nom |naissance | mort | age | +--------+------------+------------+------+ | Bowser | 1989-08-31 | 1995-07-29 | 5 | +--------+------------+------------+------+
Cette requête utilise mort IS NOT NULL
plutôt que mort <> NULL
parce que
NULL
est une valeur spéciale. Cela sera
expliqué plus tard. See Section 3.3.4.6, « Travailler avec la valeur NULL
».
Vous désirez savoir quels sont les animaux qui ont leur
anniversaire le mois prochain ? Pour effectuer ce type de
calculs, l'année et le jour ne sont pas utiles ; vous voulez
simplement extraire le mois de la colonne
naissance
. MySQL fournit plusieurs
fonctions d'extraction de parties de dates, comme
YEAR()
, MONTH()
, et
DAYOFMONTH()
. MONTH()
est la fonction appropriée dans notre cas. Pour voir comment
cette fonction travaille, exécutez une requête simple qui
retourne l'naissance
et le
MONTH(naissance)
:
mysql> SELECT nom, naissance, MONTH(naissance) FROM animal;
+----------+------------+------------------+
| nom | naissance | MONTH(naissance) |
+----------+------------+------------------+
| Fluffy | 1993-02-04 | 2 |
| Claws | 1994-03-17 | 3 |
| Buffy | 1989-05-13 | 5 |
| Fang | 1990-08-27 | 8 |
| Bowser | 1989-08-31 | 8 |
| Chirpy | 1998-09-11 | 9 |
| Whistler | 1997-12-09 | 12 |
| Slim | 1996-04-29 | 4 |
| Puffball | 1999-03-30 | 3 |
+----------+------------+------------------+
Trouver les animaux qui ont leur anniversaire dans le mois
suivant est aisé. Supposez que le mois courant est Avril.
Donc, la valeur du mois est 4
et vous
cherchez les animaux nés en Mai (mois 5) comme ceci :
mysql> SELECT nom, naissance FROM animal WHERE MONTH(naissance) = 5;
+-------+------------+
| nom |naissance |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+
Il y a une petite complication si le mois courant est
Décembre, bien sûr. Vous ne pouvez pas uniquement ajouter 1
au numéro du mois courant (12
) et chercher
les animaux qui sont nés le mois numéro 13, parce qu'il
n'existe pas. A la place, vous cherchez les animaux nés en
Janvier (mois numéro 1).
Vous pouvez toujours écrire une requête qui fonctionne
quelque soit le mois courant. Comme cela, vous n'avez pas à
utiliser un numéro de mois particulier dans votre requête.
DATE_ADD()
vous permet d'ajouter un
intervalle de temps à une date donnée. Si vous ajoutez un
mois à la valeur de NOW()
, et que vous
extrayez le mois à l'aide de MONTH()
, le
résultat produit le mois dans lequel vous devez chercher un
anniversaire :
mysql>SELECT nom, naissance FROM animal
->WHERE MONTH(naissance) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
Une manière différente d'arriver au même résultat est
d'ajouter 1
pour trouver le mois prochain
après le mois courant (après l'usage de la fonction
(MOD
) pour ajouter à la valeur du mois la
valeur 0
si il est de
12
) :
mysql>SELECT nom, naissance FROM animal
->WHERE MONTH(naissance) = MOD(MONTH(NOW()), 12) + 1;
Notez que MONTH
retourne un nombre entre 1
et 12. MOD(quelquechose,12)
retourne un
nombre entre 0 et 11. Donc, l'addition doit être faite après
l'utilisation de la fonction MOD()
, sinon,
nous aurions un intervalle entre Novembre (11) et Janvier (1).
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.