В MariaDB, EXTRACT()
е вградена функция за дата и час, която връща посочената единица от даден израз за дата или час.
Синтаксис
Синтаксисът е така:
EXTRACT(unit FROM date)
Където unit
е валидна единица за дата и час и date
е датата, от която се извлича тази единица.
Пример
Ето пример, който извлича годината от дата:
SELECT EXTRACT(YEAR FROM '2030-12-25');
Резултат:
+---------------------------------+ | EXTRACT(YEAR FROM '2030-12-25') | +---------------------------------+ | 2030 | +---------------------------------+
Ето още един, който извлича деня:
SELECT EXTRACT(DAY FROM '2030-12-25');
Резултат:
+--------------------------------+ | EXTRACT(DAY FROM '2030-12-25') | +--------------------------------+ | 25 | +--------------------------------+
Стойности за дата и час
Работи и със стойности за дата и час:
SELECT EXTRACT(HOUR FROM '2030-02-01 10:30:45');
Резултат:
+------------------------------------------+ | EXTRACT(HOUR FROM '2030-02-01 10:30:45') | +------------------------------------------+ | 10 | +------------------------------------------+
Единици за дата и час
Ето още един пример, който преминава през всяка единица в израза за дата и час:
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;
Резултат:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 2030 | 2 | 1 | 10 | 30 | 45 | 123456 | +------+-------+------+------+--------+--------+-------------+
Съставни единици
Ето пример, който използва съставна единица. Съставните единици се състоят от множество основни единици за време.
SELECT EXTRACT(YEAR_MONTH FROM '2030-02-01');
Резултат:
+---------------------------------------+ | EXTRACT(YEAR_MONTH FROM '2030-02-01') | +---------------------------------------+ | 203002 | +---------------------------------------+
Нулеви единици
Нулевите единици водят до 0
.
Пример:
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;
Резултат:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------+-------+------+------+--------+--------+-------------+
Числови дати
Възможно е също да предавате дати като число, стига да има смисъл като дата.
Пример
SELECT EXTRACT(MONTH FROM 20301125);
Резултат:
+------------------------------+ | EXTRACT(MONTH FROM 20301125) | +------------------------------+ | 11 | +------------------------------+
Или дори следното (което използва двуцифрена година):
SELECT EXTRACT(YEAR FROM 301125);
Резултат:
+---------------------------+ | EXTRACT(YEAR FROM 301125) | +---------------------------+ | 2030 | +---------------------------+
Но бъдете внимателни тук – MariaDB по принцип трябва да отгатне коя година е. Ето какво се случва, ако увелича годината от 30 на 80:
SELECT EXTRACT(YEAR FROM 801125);
Резултат:
+---------------------------+ | EXTRACT(YEAR FROM 801125) | +---------------------------+ | 1980 | +---------------------------+
Така че в този случай се предава 30
доведе до 2030
но предава 80
върнати 1980
.
Освен това трябва да има смисъл като дата. Ето какво се случва, ако използвам невалиден ден:
SELECT EXTRACT(YEAR FROM 20300135);
Резултат:
+-----------------------------+ | EXTRACT(YEAR FROM 20300135) | +-----------------------------+ | NULL | +-----------------------------+
Други ограничители
Можете да използвате други разделители за датата. MariaDB е доста прощаваща, когато става въпрос за разделители на дати. Ето няколко валидни примера:
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');
Резултат (с помощта на вертикален изход):
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
Текуща дата
Можем да предадем NOW()
като аргумент за дата, за да използвате текущата дата:
SELECT
NOW(),
EXTRACT(MONTH FROM NOW());
Резултат:
+---------------------+---------------------------+ | NOW() | EXTRACT(MONTH FROM NOW()) | +---------------------+---------------------------+ | 2021-05-16 10:06:21 | 5 | +---------------------+---------------------------+
Невалидни дати
При преминаване на невалидна дата, EXTRACT()
връща null
:
SELECT EXTRACT(YEAR FROM 'Friday');
Резултат:
+-----------------------------+ | EXTRACT(YEAR FROM 'Friday') | +-----------------------------+ | NULL | +-----------------------------+
Невалидна единица за дата/час
Когато се подаде невалидна единица за дата/час, EXTRACT()
връща грешка:
SELECT EXTRACT(DECADE FROM '2030-06-25');
Резултат:
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
Липсващ аргумент
Извикване на EXTRACT()
без подаване на аргументи води до грешка:
SELECT EXTRACT();
Резултат:
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