In MariaDB, EXTRACT()
è una funzione di data e ora incorporata che restituisce l'unità specificata da una data data o un'espressione datetime.
Sintassi
La sintassi è questa:
EXTRACT(unit FROM date)
Dove unit
è un'unità di data e ora valida e date
è la data da cui estrarre quell'unità.
Esempio
Ecco un esempio che estrae l'anno da una data:
SELECT EXTRACT(YEAR FROM '2030-12-25');
Risultato:
+---------------------------------+ | EXTRACT(YEAR FROM '2030-12-25') | +---------------------------------+ | 2030 | +---------------------------------+
Eccone un altro che estrae il giorno:
SELECT EXTRACT(DAY FROM '2030-12-25');
Risultato:
+--------------------------------+ | EXTRACT(DAY FROM '2030-12-25') | +--------------------------------+ | 25 | +--------------------------------+
Valori di data e ora
Funziona anche con i valori datetime:
SELECT EXTRACT(HOUR FROM '2030-02-01 10:30:45');
Risultato:
+------------------------------------------+ | EXTRACT(HOUR FROM '2030-02-01 10:30:45') | +------------------------------------------+ | 10 | +------------------------------------------+
Unità di data e ora
Ecco un altro esempio che attraversa ciascuna unità nell'espressione 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;
Risultato:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 2030 | 2 | 1 | 10 | 30 | 45 | 123456 | +------+-------+------+------+--------+--------+-------------+
Unità composite
Ecco un esempio che utilizza un'unità composita. Le unità composite sono costituite da più unità temporali di base.
SELECT EXTRACT(YEAR_MONTH FROM '2030-02-01');
Risultato:
+---------------------------------------+ | EXTRACT(YEAR_MONTH FROM '2030-02-01') | +---------------------------------------+ | 203002 | +---------------------------------------+
Zero unità
Le unità zero danno come risultato 0
.
Esempio:
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;
Risultato:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------+-------+------+------+--------+--------+-------------+
Date numeriche
È anche possibile trasmettere le date come numero, purché abbia senso come data.
Esempio
SELECT EXTRACT(MONTH FROM 20301125);
Risultato:
+------------------------------+ | EXTRACT(MONTH FROM 20301125) | +------------------------------+ | 11 | +------------------------------+
O anche il seguente (che utilizza un anno a due cifre):
SELECT EXTRACT(YEAR FROM 301125);
Risultato:
+---------------------------+ | EXTRACT(YEAR FROM 301125) | +---------------------------+ | 2030 | +---------------------------+
Ma fai attenzione qui:MariaDB fondamentalmente deve indovinare di che anno è. Ecco cosa succede se aumento l'anno da 30 a 80:
SELECT EXTRACT(YEAR FROM 801125);
Risultato:
+---------------------------+ | EXTRACT(YEAR FROM 801125) | +---------------------------+ | 1980 | +---------------------------+
Quindi in questo caso, passando 30
ha portato a 2030
ma passando 80
restituito 1980
.
Inoltre, deve avere senso come data. Ecco cosa succede se utilizzo un giorno non valido:
SELECT EXTRACT(YEAR FROM 20300135);
Risultato:
+-----------------------------+ | EXTRACT(YEAR FROM 20300135) | +-----------------------------+ | NULL | +-----------------------------+
Altri delimitatori
È possibile utilizzare altri delimitatori per la data. MariaDB è abbastanza clemente quando si tratta di delimitatori sulle date. Ecco alcuni validi esempi:
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');
Risultato (usando l'output 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
Data attuale
Possiamo passare NOW()
come argomento data per utilizzare la data corrente:
SELECT
NOW(),
EXTRACT(MONTH FROM NOW());
Risultato:
+---------------------+---------------------------+ | NOW() | EXTRACT(MONTH FROM NOW()) | +---------------------+---------------------------+ | 2021-05-16 10:06:21 | 5 | +---------------------+---------------------------+
Date non valide
Quando viene superata una data non valida, EXTRACT()
restituisce null
:
SELECT EXTRACT(YEAR FROM 'Friday');
Risultato:
+-----------------------------+ | EXTRACT(YEAR FROM 'Friday') | +-----------------------------+ | NULL | +-----------------------------+
Unità di data/ora non valida
Quando viene superata un'unità di data/ora non valida, EXTRACT()
restituisce un errore:
SELECT EXTRACT(DECADE FROM '2030-06-25');
Risultato:
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
Argomento mancante
Chiamando EXTRACT()
senza passare alcun argomento genera un errore:
SELECT EXTRACT();
Risultato:
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