I MariaDB, EXTRACT()
är en inbyggd datum- och tidsfunktion som returnerar den angivna enheten från ett givet datum- eller datetime-uttryck.
Syntax
Syntaxen ser ut så här:
EXTRACT(unit FROM date)
Där unit
är en giltig datum- och tidsenhet och date
är datumet att extrahera den enheten från.
Exempel
Här är ett exempel som extraherar året från ett datum:
SELECT EXTRACT(YEAR FROM '2030-12-25');
Resultat:
+---------------------------------+ | EXTRACT(YEAR FROM '2030-12-25') | +---------------------------------+ | 2030 | +---------------------------------+
Här är en annan som extraherar dagen:
SELECT EXTRACT(DAY FROM '2030-12-25');
Resultat:
+--------------------------------+ | EXTRACT(DAY FROM '2030-12-25') | +--------------------------------+ | 25 | +--------------------------------+
Datetime-värden
Det fungerar också med datetime-värden:
SELECT EXTRACT(HOUR FROM '2030-02-01 10:30:45');
Resultat:
+------------------------------------------+ | EXTRACT(HOUR FROM '2030-02-01 10:30:45') | +------------------------------------------+ | 10 | +------------------------------------------+
Datum- och tidsenheter
Här är ett annat exempel som går igenom varje enhet i datetime-uttrycket:
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;
Resultat:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 2030 | 2 | 1 | 10 | 30 | 45 | 123456 | +------+-------+------+------+--------+--------+-------------+
Kompositenheter
Här är ett exempel som använder en sammansatt enhet. Sammansatta enheter består av flera bastidsenheter.
SELECT EXTRACT(YEAR_MONTH FROM '2030-02-01');
Resultat:
+---------------------------------------+ | EXTRACT(YEAR_MONTH FROM '2030-02-01') | +---------------------------------------+ | 203002 | +---------------------------------------+
Noll enheter
Noll enheter resulterar i 0
.
Exempel:
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;
Resultat:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------+-------+------+------+--------+--------+-------------+
Numeriska datum
Det är också möjligt att skicka datum som ett nummer, så länge det är vettigt som ett datum.
Exempel
SELECT EXTRACT(MONTH FROM 20301125);
Resultat:
+------------------------------+ | EXTRACT(MONTH FROM 20301125) | +------------------------------+ | 11 | +------------------------------+
Eller till och med följande (som använder ett tvåsiffrigt år):
SELECT EXTRACT(YEAR FROM 301125);
Resultat:
+---------------------------+ | EXTRACT(YEAR FROM 301125) | +---------------------------+ | 2030 | +---------------------------+
Men var försiktig här – MariaDB måste i princip gissa vilket år det är. Så här händer om jag ökar året från 30 till 80:
SELECT EXTRACT(YEAR FROM 801125);
Resultat:
+---------------------------+ | EXTRACT(YEAR FROM 801125) | +---------------------------+ | 1980 | +---------------------------+
Så i det här fallet skickar du 30
resulterade i 2030
men klarar 80
returnerade 1980
.
Det måste också vara vettigt som ett datum. Så här händer om jag använder en ogiltig dag:
SELECT EXTRACT(YEAR FROM 20300135);
Resultat:
+-----------------------------+ | EXTRACT(YEAR FROM 20300135) | +-----------------------------+ | NULL | +-----------------------------+
Andra avgränsare
Du kan använda andra avgränsare för datumet. MariaDB är ganska förlåtande när det kommer till avgränsare på datum. Här är några giltiga exempel:
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');
Resultat (med vertikal utdata):
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
Aktuellt datum
Vi kan skicka NOW()
som datumargument för att använda det aktuella datumet:
SELECT
NOW(),
EXTRACT(MONTH FROM NOW());
Resultat:
+---------------------+---------------------------+ | NOW() | EXTRACT(MONTH FROM NOW()) | +---------------------+---------------------------+ | 2021-05-16 10:06:21 | 5 | +---------------------+---------------------------+
Ogiltiga datum
När ett ogiltigt datum passerat, EXTRACT()
returnerar null
:
SELECT EXTRACT(YEAR FROM 'Friday');
Resultat:
+-----------------------------+ | EXTRACT(YEAR FROM 'Friday') | +-----------------------------+ | NULL | +-----------------------------+
Ogiltig datum-/tidsenhet
När en ogiltig datum-/tidsenhet passerats, EXTRACT()
returnerar ett fel:
SELECT EXTRACT(DECADE FROM '2030-06-25');
Resultat:
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 saknas
Anropar EXTRACT()
utan att skicka några argument resulterar i ett fel:
SELECT EXTRACT();
Resultat:
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