| 3.3.4 Récupérer des informations à partir d'une table
 3.3 Création et utilisation d'une base de données
 3 Tutoriels d'introduction
 Manuel de Référence MySQL 4.1 : Version Française
 
 . Sélectionner toutes les données
 . Sélectionner des lignes particulières
 . Sélectionner des colonnes particulières
 . Trier les enregistrements
 ->Calcul sur les Dates
 . Travailler avec la valeur NULL
 . Recherche de modèles
 . Compter les lignes
 . Utiliser plus d'une table
 
 
 | 
  3.3.4.5 Calcul sur les Dates 
    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.
 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.| 
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 |
 +----------+------------+--------------+------+
 | 
 
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 :
 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 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 |
 +----------+------------+--------------+------+
 | 
 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, 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 |
 +----------+------------+--------------+------+
 | 
 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.
 Travailler avec les valeurs 
NULL
 .| 
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 |
 +--------+------------+------------+------+
 | 
 
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)
  :
 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, 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 |
 +----------+------------+------------------+
 | 
 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) = 5;+-------+------------+
 | nom   |naissance   |
 +-------+------------+
 | Buffy | 1989-05-13 |
 +-------+------------+
 | 
 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) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
 | 
 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).| 
mysql> SELECT nom, naissance FROM animal-> WHERE MONTH(naissance) = MOD(MONTH(NOW()), 12) + 1;
 | 
 |