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.
mysql> SELECT nom, naissance, CURRENT_DATE, -> (YEAR(CURRENT_DATE)-YEAR(naissance)) -> - (RIGHT(CURRENT_DATE,5)<RIGHT(naissance,5)) -> AS age -> FROM animaux; +----------+------------+--------------+------+ | 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 animaux 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 animaux 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(death)-YEAR(naissance)) - (RIGHT(mort,5)<RIGHT(naissance,5)) -> AS age -> FROM animaux 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.
Travailler avec les valeurs
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 animaux; +----------+------------+------------------+ | 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 animaux 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 animaux -> 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 animaux -> 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).
|