Dans MariaDB, EXTRACT()
est une fonction de date et d'heure intégrée qui renvoie l'unité spécifiée à partir d'une expression de date ou de date/heure donnée.
Syntaxe
La syntaxe ressemble à ceci :
EXTRACT(unit FROM date)
Où unit
est une unité de date et d'heure valide, et date
est la date à partir de laquelle extraire cette unité.
Exemple
Voici un exemple qui extrait l'année d'une date :
SELECT EXTRACT(YEAR FROM '2030-12-25');
Résultat :
+---------------------------------+ | EXTRACT(YEAR FROM '2030-12-25') | +---------------------------------+ | 2030 | +---------------------------------+
En voici un autre qui extrait le jour :
SELECT EXTRACT(DAY FROM '2030-12-25');
Résultat :
+--------------------------------+ | EXTRACT(DAY FROM '2030-12-25') | +--------------------------------+ | 25 | +--------------------------------+
Valeurs DateHeure
Cela fonctionne également avec les valeurs datetime :
SELECT EXTRACT(HOUR FROM '2030-02-01 10:30:45');
Résultat :
+------------------------------------------+ | EXTRACT(HOUR FROM '2030-02-01 10:30:45') | +------------------------------------------+ | 10 | +------------------------------------------+
Unités de date et d'heure
Voici un autre exemple qui traverse chaque unité dans l'expression datetime :
SELECT
EXTRACT(YEAR FROM '2030-02-01 10:30:45.123456') AS YEAR,
EXTRACT(MONTH FROM '2030-02-01 10:30:45.123456') AS MONTH,
EXTRACT(DAY FROM '2030-02-01 10:30:45.123456') AS DAY,
EXTRACT(HOUR FROM '2030-02-01 10:30:45.123456') AS HOUR,
EXTRACT(MINUTE FROM '2030-02-01 10:30:45.123456') AS MINUTE,
EXTRACT(SECOND FROM '2030-02-01 10:30:45.123456') AS SECOND,
EXTRACT(MICROSECOND FROM '2030-02-01 10:30:45.123456') AS MICROSECOND;
Résultat :
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 2030 | 2 | 1 | 10 | 30 | 45 | 123456 | +------+-------+------+------+--------+--------+-------------+
Unités composites
Voici un exemple qui utilise une unité composite. Les unités composites se composent de plusieurs unités de temps de base.
SELECT EXTRACT(YEAR_MONTH FROM '2030-02-01');
Résultat :
+---------------------------------------+ | EXTRACT(YEAR_MONTH FROM '2030-02-01') | +---------------------------------------+ | 203002 | +---------------------------------------+
Zéro Unités
Zéro unité donne 0
.
Exemple :
SELECT
EXTRACT(YEAR FROM '0000-00-00 00:00:00.000000') AS YEAR,
EXTRACT(MONTH FROM '0000-00-00 00:00:00.000000') AS MONTH,
EXTRACT(DAY FROM '0000-00-00 00:00:00.000000') AS DAY,
EXTRACT(HOUR FROM '0000-00-00 00:00:00.000000') AS HOUR,
EXTRACT(MINUTE FROM '0000-00-00 00:00:00.000000') AS MINUTE,
EXTRACT(SECOND FROM '0000-00-00 00:00:00.000000') AS SECOND,
EXTRACT(MICROSECOND FROM '0000-00-00 00:00:00.000000') AS MICROSECOND;
Résultat :
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------+-------+------+------+--------+--------+-------------+
Dates numériques
Il est également possible de transmettre des dates sous forme de nombre, tant que cela a du sens en tant que date.
Exemple
SELECT EXTRACT(MONTH FROM 20301125);
Résultat :
+------------------------------+ | EXTRACT(MONTH FROM 20301125) | +------------------------------+ | 11 | +------------------------------+
Ou même le suivant (qui utilise une année à deux chiffres) :
SELECT EXTRACT(YEAR FROM 301125);
Résultat :
+---------------------------+ | EXTRACT(YEAR FROM 301125) | +---------------------------+ | 2030 | +---------------------------+
Mais soyez prudent ici - MariaDB doit essentiellement deviner de quelle année il s'agit. Voici ce qui se passe si j'augmente l'année de 30 à 80 :
SELECT EXTRACT(YEAR FROM 801125);
Résultat :
+---------------------------+ | EXTRACT(YEAR FROM 801125) | +---------------------------+ | 1980 | +---------------------------+
Donc dans ce cas, passer 30
a abouti à 2030
mais passant 80
renvoyé 1980
.
En outre, cela doit avoir un sens en tant que date. Voici ce qui se passe si j'utilise un jour invalide :
SELECT EXTRACT(YEAR FROM 20300135);
Résultat :
+-----------------------------+ | EXTRACT(YEAR FROM 20300135) | +-----------------------------+ | NULL | +-----------------------------+
Autres délimiteurs
Vous pouvez utiliser d'autres délimiteurs pour la date. MariaDB est assez indulgent en ce qui concerne les délimiteurs de dates. Voici quelques exemples valides :
SELECT
EXTRACT(MONTH FROM '2030/06/25'),
EXTRACT(MONTH FROM '2030,06,25'),
EXTRACT(MONTH FROM '2030:06:25'),
EXTRACT(MONTH FROM '2030;06!25');
Résultat (en utilisant la sortie verticale) :
EXTRACT(MONTH FROM '2030/06/25'): 6 EXTRACT(MONTH FROM '2030,06,25'): 6 EXTRACT(MONTH FROM '2030:06:25'): 6 EXTRACT(MONTH FROM '2030;06!25'): 6
Date actuelle
Nous pouvons passer NOW()
comme argument de date pour utiliser la date actuelle :
SELECT
NOW(),
EXTRACT(MONTH FROM NOW());
Résultat :
+---------------------+---------------------------+ | NOW() | EXTRACT(MONTH FROM NOW()) | +---------------------+---------------------------+ | 2021-05-16 10:06:21 | 5 | +---------------------+---------------------------+
Dates invalides
Lorsqu'une date invalide est passée, EXTRACT()
renvoie null
:
SELECT EXTRACT(YEAR FROM 'Friday');
Résultat :
+-----------------------------+ | EXTRACT(YEAR FROM 'Friday') | +-----------------------------+ | NULL | +-----------------------------+
Unité de date/heure non valide
En cas de passage d'une unité de date/heure invalide, EXTRACT()
renvoie une erreur :
SELECT EXTRACT(DECADE FROM '2030-06-25');
Résultat :
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DECADE FROM '2030-06-25')' at line 1
Argument manquant
Appel de EXTRACT()
sans passer d'arguments entraîne une erreur :
SELECT EXTRACT();
Résultat :
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1