In MariaDB, EXTRACT()
is een ingebouwde datum- en tijdfunctie die de opgegeven eenheid retourneert uit een bepaalde datum- of datetime-expressie.
Syntaxis
De syntaxis gaat als volgt:
EXTRACT(unit FROM date)
Waar unit
is een geldige datum- en tijdseenheid, en date
is de datum om die eenheid uit te halen.
Voorbeeld
Hier is een voorbeeld dat het jaar uit een datum haalt:
SELECT EXTRACT(YEAR FROM '2030-12-25');
Resultaat:
+---------------------------------+ | EXTRACT(YEAR FROM '2030-12-25') | +---------------------------------+ | 2030 | +---------------------------------+
Hier is er nog een die de dag extraheert:
SELECT EXTRACT(DAY FROM '2030-12-25');
Resultaat:
+--------------------------------+ | EXTRACT(DAY FROM '2030-12-25') | +--------------------------------+ | 25 | +--------------------------------+
Datum/tijd-waarden
Het werkt ook met datetime-waarden:
SELECT EXTRACT(HOUR FROM '2030-02-01 10:30:45');
Resultaat:
+------------------------------------------+ | EXTRACT(HOUR FROM '2030-02-01 10:30:45') | +------------------------------------------+ | 10 | +------------------------------------------+
Datum- en tijdseenheden
Hier is nog een voorbeeld dat door elke eenheid in de datetime-expressie loopt:
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;
Resultaat:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 2030 | 2 | 1 | 10 | 30 | 45 | 123456 | +------+-------+------+------+--------+--------+-------------+
Samengestelde eenheden
Hier is een voorbeeld dat een samengestelde eenheid gebruikt. Samengestelde eenheden bestaan uit meerdere basistijdseenheden.
SELECT EXTRACT(YEAR_MONTH FROM '2030-02-01');
Resultaat:
+---------------------------------------+ | EXTRACT(YEAR_MONTH FROM '2030-02-01') | +---------------------------------------+ | 203002 | +---------------------------------------+
Nul eenheden
Nul eenheden resulteren in 0
.
Voorbeeld:
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;
Resultaat:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------+-------+------+------+--------+--------+-------------+
Numerieke datums
Het is ook mogelijk om datums als een getal door te geven, zolang het maar logisch is als een datum.
Voorbeeld
SELECT EXTRACT(MONTH FROM 20301125);
Resultaat:
+------------------------------+ | EXTRACT(MONTH FROM 20301125) | +------------------------------+ | 11 | +------------------------------+
Of zelfs het volgende (met een jaartal van twee cijfers):
SELECT EXTRACT(YEAR FROM 301125);
Resultaat:
+---------------------------+ | EXTRACT(YEAR FROM 301125) | +---------------------------+ | 2030 | +---------------------------+
Maar wees hier voorzichtig - MariaDB moet eigenlijk raden welk jaar het is. Dit is wat er gebeurt als ik het jaar verhoog van 30 naar 80:
SELECT EXTRACT(YEAR FROM 801125);
Resultaat:
+---------------------------+ | EXTRACT(YEAR FROM 801125) | +---------------------------+ | 1980 | +---------------------------+
Dus in dit geval, het doorgeven van 30
resulteerde in 2030
maar slagen voor 80
geretourneerd 1980
.
Het moet ook logisch zijn als een date. Dit gebeurt er als ik een ongeldige dag gebruik:
SELECT EXTRACT(YEAR FROM 20300135);
Resultaat:
+-----------------------------+ | EXTRACT(YEAR FROM 20300135) | +-----------------------------+ | NULL | +-----------------------------+
Andere scheidingstekens
U kunt andere scheidingstekens voor de datum gebruiken. MariaDB is behoorlijk vergevingsgezind als het gaat om scheidingstekens op datums. Hier zijn enkele geldige voorbeelden:
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');
Resultaat (met verticale uitvoer):
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
Huidige datum
We kunnen NOW()
doorgeven als het datumargument om de huidige datum te gebruiken:
SELECT
NOW(),
EXTRACT(MONTH FROM NOW());
Resultaat:
+---------------------+---------------------------+ | NOW() | EXTRACT(MONTH FROM NOW()) | +---------------------+---------------------------+ | 2021-05-16 10:06:21 | 5 | +---------------------+---------------------------+
Ongeldige datums
Wanneer een ongeldige datum is gepasseerd, EXTRACT()
retourneert null
:
SELECT EXTRACT(YEAR FROM 'Friday');
Resultaat:
+-----------------------------+ | EXTRACT(YEAR FROM 'Friday') | +-----------------------------+ | NULL | +-----------------------------+
Ongeldige datum/tijd-eenheid
Wanneer een ongeldige datum/tijd-eenheid is gepasseerd, EXTRACT()
geeft een fout:
SELECT EXTRACT(DECADE FROM '2030-06-25');
Resultaat:
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
Ontbrekend argument
EXTRACT()
. aanroepen zonder het doorgeven van argumenten resulteert in een fout:
SELECT EXTRACT();
Resultaat:
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