No MariaDB,
EXTRACT()
é uma função de data e hora integrada que retorna a unidade especificada de uma determinada expressão de data ou data/hora. Sintaxe
A sintaxe fica assim:
EXTRACT(unit FROM date)
Onde
unit
é uma unidade de data e hora válida e date
é a data para extrair essa unidade. Exemplo
Aqui está um exemplo que extrai o ano de uma data:
SELECT EXTRACT(YEAR FROM '2030-12-25');
Resultado:
+---------------------------------+ | EXTRACT(YEAR FROM '2030-12-25') | +---------------------------------+ | 2030 | +---------------------------------+
Aqui está outro que extrai o dia:
SELECT EXTRACT(DAY FROM '2030-12-25');
Resultado:
+--------------------------------+ | EXTRACT(DAY FROM '2030-12-25') | +--------------------------------+ | 25 | +--------------------------------+
Valores de data e hora
Também funciona com valores de data e hora:
SELECT EXTRACT(HOUR FROM '2030-02-01 10:30:45');
Resultado:
+------------------------------------------+ | EXTRACT(HOUR FROM '2030-02-01 10:30:45') | +------------------------------------------+ | 10 | +------------------------------------------+
Unidades de data e hora
Aqui está outro exemplo que percorre cada unidade na expressão 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;
Resultado:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 2030 | 2 | 1 | 10 | 30 | 45 | 123456 | +------+-------+------+------+--------+--------+-------------+
Unidades Compostas
Aqui está um exemplo que usa uma unidade composta. As unidades compostas consistem em várias unidades de tempo base.
SELECT EXTRACT(YEAR_MONTH FROM '2030-02-01');
Resultado:
+---------------------------------------+ | EXTRACT(YEAR_MONTH FROM '2030-02-01') | +---------------------------------------+ | 203002 | +---------------------------------------+
Zero Unidades
Zero unidades resultam em
0
. Exemplo:
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;
Resultado:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------+-------+------+------+--------+--------+-------------+
Datas numéricas
Também é possível passar datas como um número, desde que faça sentido como uma data.
Exemplo
SELECT EXTRACT(MONTH FROM 20301125);
Resultado:
+------------------------------+ | EXTRACT(MONTH FROM 20301125) | +------------------------------+ | 11 | +------------------------------+
Ou mesmo o seguinte (que usa um ano de dois dígitos):
SELECT EXTRACT(YEAR FROM 301125);
Resultado:
+---------------------------+ | EXTRACT(YEAR FROM 301125) | +---------------------------+ | 2030 | +---------------------------+
Mas tenha cuidado aqui - MariaDB basicamente tem que adivinhar em que ano é. Aqui está o que acontece se eu aumentar o ano de 30 para 80:
SELECT EXTRACT(YEAR FROM 801125);
Resultado:
+---------------------------+ | EXTRACT(YEAR FROM 801125) | +---------------------------+ | 1980 | +---------------------------+
Então, neste caso, passando
30
resultou em 2030
mas passando 80
retornou 1980
. Além disso, deve fazer sentido como uma data. Veja o que acontece se eu usar um dia inválido:
SELECT EXTRACT(YEAR FROM 20300135);
Resultado:
+-----------------------------+ | EXTRACT(YEAR FROM 20300135) | +-----------------------------+ | NULL | +-----------------------------+
Outros delimitadores
Você pode usar outros delimitadores para a data. O MariaDB é bastante tolerante quando se trata de delimitadores de datas. Aqui estão alguns exemplos válidos:
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');
Resultado (usando saída vertical):
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
Data atual
Podemos passar
NOW()
como argumento de data para usar a data atual:SELECT
NOW(),
EXTRACT(MONTH FROM NOW());
Resultado:
+---------------------+---------------------------+ | NOW() | EXTRACT(MONTH FROM NOW()) | +---------------------+---------------------------+ | 2021-05-16 10:06:21 | 5 | +---------------------+---------------------------+
Datas inválidas
Quando passa uma data inválida,
EXTRACT()
retorna null
:SELECT EXTRACT(YEAR FROM 'Friday');
Resultado:
+-----------------------------+ | EXTRACT(YEAR FROM 'Friday') | +-----------------------------+ | NULL | +-----------------------------+
Unidade de data/hora inválida
Ao passar uma unidade de data/hora inválida,
EXTRACT()
retorna um erro:SELECT EXTRACT(DECADE FROM '2030-06-25');
Resultado:
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
Argumento ausente
Chamando
EXTRACT()
sem passar nenhum argumento resulta em um erro:SELECT EXTRACT();
Resultado:
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