V MariaDB EXTRACT()
je vestavěná funkce data a času, která vrací zadanou jednotku z daného výrazu data nebo data a času.
Syntaxe
Syntaxe vypadá takto:
EXTRACT(unit FROM date)
Kde unit
je platná jednotka data a času a date
je datum, ze kterého se má jednotka extrahovat.
Příklad
Zde je příklad, který extrahuje rok z data:
SELECT EXTRACT(YEAR FROM '2030-12-25');
Výsledek:
+---------------------------------+ | EXTRACT(YEAR FROM '2030-12-25') | +---------------------------------+ | 2030 | +---------------------------------+
Zde je další, který vyjímá den:
SELECT EXTRACT(DAY FROM '2030-12-25');
Výsledek:
+--------------------------------+ | EXTRACT(DAY FROM '2030-12-25') | +--------------------------------+ | 25 | +--------------------------------+
Hodnoty data a času
Funguje také s hodnotami datetime:
SELECT EXTRACT(HOUR FROM '2030-02-01 10:30:45');
Výsledek:
+------------------------------------------+ | EXTRACT(HOUR FROM '2030-02-01 10:30:45') | +------------------------------------------+ | 10 | +------------------------------------------+
Jednotky data a času
Zde je další příklad, který prochází každou jednotkou ve výrazu 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;
Výsledek:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 2030 | 2 | 1 | 10 | 30 | 45 | 123456 | +------+-------+------+------+--------+--------+-------------+
Složené jednotky
Zde je příklad, který používá složenou jednotku. Složené jednotky se skládají z několika základních časových jednotek.
SELECT EXTRACT(YEAR_MONTH FROM '2030-02-01');
Výsledek:
+---------------------------------------+ | EXTRACT(YEAR_MONTH FROM '2030-02-01') | +---------------------------------------+ | 203002 | +---------------------------------------+
Nulové jednotky
Výsledkem nulových jednotek je 0
.
Příklad:
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;
Výsledek:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------+-------+------+------+--------+--------+-------------+
Číselná data
Je také možné předávat data jako číslo, pokud to dává smysl jako datum.
Příklad
SELECT EXTRACT(MONTH FROM 20301125);
Výsledek:
+------------------------------+ | EXTRACT(MONTH FROM 20301125) | +------------------------------+ | 11 | +------------------------------+
Nebo dokonce následující (který používá dvouciferný rok):
SELECT EXTRACT(YEAR FROM 301125);
Výsledek:
+---------------------------+ | EXTRACT(YEAR FROM 301125) | +---------------------------+ | 2030 | +---------------------------+
Tady ale pozor – MariaDB v podstatě musí uhodnout, který je to rok. Zde je to, co se stane, když zvýším rok z 30 na 80:
SELECT EXTRACT(YEAR FROM 801125);
Výsledek:
+---------------------------+ | EXTRACT(YEAR FROM 801125) | +---------------------------+ | 1980 | +---------------------------+
Takže v tomto případě předání 30
výsledkem je 2030
ale předání 80
vrátil 1980
.
Také to musí dávat smysl jako rande. Pokud použiji neplatný den, stane se toto:
SELECT EXTRACT(YEAR FROM 20300135);
Výsledek:
+-----------------------------+ | EXTRACT(YEAR FROM 20300135) | +-----------------------------+ | NULL | +-----------------------------+
Další oddělovače
Pro datum můžete použít jiné oddělovače. MariaDB je docela shovívavá, pokud jde o oddělovače dat. Zde je několik platných příkladů:
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');
Výsledek (při použití vertikálního výstupu):
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
Aktuální datum
Můžeme předat NOW()
jako argument data pro použití aktuálního data:
SELECT
NOW(),
EXTRACT(MONTH FROM NOW());
Výsledek:
+---------------------+---------------------------+ | NOW() | EXTRACT(MONTH FROM NOW()) | +---------------------+---------------------------+ | 2021-05-16 10:06:21 | 5 | +---------------------+---------------------------+
Neplatná data
Když bylo zadáno neplatné datum, EXTRACT()
vrátí null
:
SELECT EXTRACT(YEAR FROM 'Friday');
Výsledek:
+-----------------------------+ | EXTRACT(YEAR FROM 'Friday') | +-----------------------------+ | NULL | +-----------------------------+
Neplatná jednotka data/času
Při předání nesprávné jednotky data/času EXTRACT()
vrátí chybu:
SELECT EXTRACT(DECADE FROM '2030-06-25');
Výsledek:
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
Chybí argument
Volání EXTRACT()
bez předání jakýchkoli argumentů dojde k chybě:
SELECT EXTRACT();
Výsledek:
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