MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Como EXTRACT() funciona no MariaDB


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