W MariaDB, EXTRACT()
jest wbudowaną funkcją daty i czasu, która zwraca określoną jednostkę z podanego wyrażenia daty lub czasu.
Składnia
Składnia wygląda tak:
EXTRACT(unit FROM date)
Gdzie unit
jest prawidłową jednostką daty i czasu, a date
to data, z której należy wyodrębnić tę jednostkę.
Przykład
Oto przykład, który wyodrębnia rok z daty:
SELECT EXTRACT(YEAR FROM '2030-12-25');
Wynik:
+---------------------------------+ | EXTRACT(YEAR FROM '2030-12-25') | +---------------------------------+ | 2030 | +---------------------------------+
Oto kolejny, który wyodrębnia dzień:
SELECT EXTRACT(DAY FROM '2030-12-25');
Wynik:
+--------------------------------+ | EXTRACT(DAY FROM '2030-12-25') | +--------------------------------+ | 25 | +--------------------------------+
Wartości daty i godziny
Działa również z wartościami daty i godziny:
SELECT EXTRACT(HOUR FROM '2030-02-01 10:30:45');
Wynik:
+------------------------------------------+ | EXTRACT(HOUR FROM '2030-02-01 10:30:45') | +------------------------------------------+ | 10 | +------------------------------------------+
Jednostki daty i czasu
Oto kolejny przykład, który przechodzi przez każdą jednostkę w wyrażeniu daty i godziny:
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;
Wynik:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 2030 | 2 | 1 | 10 | 30 | 45 | 123456 | +------+-------+------+------+--------+--------+-------------+
Jednostki złożone
Oto przykład, który używa jednostki złożonej. Jednostki złożone składają się z wielu jednostek czasu podstawowego.
SELECT EXTRACT(YEAR_MONTH FROM '2030-02-01');
Wynik:
+---------------------------------------+ | EXTRACT(YEAR_MONTH FROM '2030-02-01') | +---------------------------------------+ | 203002 | +---------------------------------------+
Zero jednostek
Zero jednostek daje w wyniku 0
.
Przykład:
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;
Wynik:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------+-------+------+------+--------+--------+-------------+
Daty numeryczne
Możliwe jest również przekazywanie dat jako liczby, o ile ma to sens jako data.
Przykład
SELECT EXTRACT(MONTH FROM 20301125);
Wynik:
+------------------------------+ | EXTRACT(MONTH FROM 20301125) | +------------------------------+ | 11 | +------------------------------+
Lub nawet następujący (który używa dwucyfrowego roku):
SELECT EXTRACT(YEAR FROM 301125);
Wynik:
+---------------------------+ | EXTRACT(YEAR FROM 301125) | +---------------------------+ | 2030 | +---------------------------+
Ale bądź ostrożny – MariaDB w zasadzie musi odgadnąć, który jest rok. Oto, co się stanie, jeśli zwiększę rok z 30 do 80:
SELECT EXTRACT(YEAR FROM 801125);
Wynik:
+---------------------------+ | EXTRACT(YEAR FROM 801125) | +---------------------------+ | 1980 | +---------------------------+
W tym przypadku przekazanie 30
zaowocowało 2030
ale przekazując 80
zwrócono 1980
.
Musi też mieć sens jako randka. Oto, co się stanie, jeśli użyję nieprawidłowego dnia:
SELECT EXTRACT(YEAR FROM 20300135);
Wynik:
+-----------------------------+ | EXTRACT(YEAR FROM 20300135) | +-----------------------------+ | NULL | +-----------------------------+
Inne ograniczniki
Możesz użyć innych ograniczników daty. MariaDB jest dość wyrozumiała, jeśli chodzi o ograniczniki dat. Oto kilka poprawnych przykładów:
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');
Wynik (przy użyciu wyjścia pionowego):
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
Aktualna data
Możemy przekazać NOW()
jako argument daty, aby użyć bieżącej daty:
SELECT
NOW(),
EXTRACT(MONTH FROM NOW());
Wynik:
+---------------------+---------------------------+ | NOW() | EXTRACT(MONTH FROM NOW()) | +---------------------+---------------------------+ | 2021-05-16 10:06:21 | 5 | +---------------------+---------------------------+
Nieprawidłowe daty
Po przekazaniu nieprawidłowej daty EXTRACT()
zwraca null
:
SELECT EXTRACT(YEAR FROM 'Friday');
Wynik:
+-----------------------------+ | EXTRACT(YEAR FROM 'Friday') | +-----------------------------+ | NULL | +-----------------------------+
Nieprawidłowa jednostka daty/godziny
Po przekazaniu nieprawidłowej jednostki daty/czasu, EXTRACT()
zwraca błąd:
SELECT EXTRACT(DECADE FROM '2030-06-25');
Wynik:
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
Brakujący argument
Wywołanie EXTRACT()
bez przekazywania jakichkolwiek argumentów powoduje błąd:
SELECT EXTRACT();
Wynik:
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