sql >> Base de Datos >  >> RDS >> MariaDB

Cómo funciona EXTRACT() en MariaDB

En MariaDB, EXTRACT() es una función de fecha y hora integrada que devuelve la unidad especificada de una expresión de fecha o fecha y hora determinada.

Sintaxis

La sintaxis es así:

EXTRACT(unit FROM date)

Donde unit es una unidad de fecha y hora válida, y date es la fecha de donde extraer esa unidad.

Ejemplo

Aquí hay un ejemplo que extrae el año de una fecha:

SELECT EXTRACT(YEAR FROM '2030-12-25');

Resultado:

+---------------------------------+
| EXTRACT(YEAR FROM '2030-12-25') |
+---------------------------------+
|                            2030 |
+---------------------------------+

Aquí hay otro que extrae el día:

SELECT EXTRACT(DAY FROM '2030-12-25');

Resultado:

+--------------------------------+
| EXTRACT(DAY FROM '2030-12-25') |
+--------------------------------+
|                             25 |
+--------------------------------+

Valores de fecha y hora

También funciona con valores de fecha y hora:

SELECT EXTRACT(HOUR FROM '2030-02-01 10:30:45');

Resultado:

+------------------------------------------+
| EXTRACT(HOUR FROM '2030-02-01 10:30:45') |
+------------------------------------------+
|                                       10 |
+------------------------------------------+

Unidades de fecha y hora

Aquí hay otro ejemplo que se ejecuta a través de cada unidad en la expresión de fecha y hora:

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 compuestas

Aquí hay un ejemplo que usa una unidad compuesta. Las unidades compuestas constan de múltiples unidades de tiempo base.

SELECT EXTRACT(YEAR_MONTH FROM '2030-02-01');

Resultado:

+---------------------------------------+
| EXTRACT(YEAR_MONTH FROM '2030-02-01') |
+---------------------------------------+
|                                203002 |
+---------------------------------------+

Unidades cero

Cero unidades dan como resultado 0 .

Ejemplo:

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 |
+------+-------+------+------+--------+--------+-------------+

Fechas numéricas

También es posible pasar fechas como un número, siempre que tenga sentido como fecha.

Ejemplo

SELECT EXTRACT(MONTH FROM 20301125);

Resultado:

+------------------------------+
| EXTRACT(MONTH FROM 20301125) |
+------------------------------+
|                           11 |
+------------------------------+

O incluso lo siguiente (que usa un año de dos dígitos):

SELECT EXTRACT(YEAR FROM 301125);

Resultado:

+---------------------------+
| EXTRACT(YEAR FROM 301125) |
+---------------------------+
|                      2030 |
+---------------------------+

Pero tenga cuidado aquí:MariaDB básicamente tiene que adivinar de qué año es. Esto es lo que sucede si aumento el año de 30 a 80:

SELECT EXTRACT(YEAR FROM 801125);

Resultado:

+---------------------------+
| EXTRACT(YEAR FROM 801125) |
+---------------------------+
|                      1980 |
+---------------------------+

Entonces, en este caso, pasar 30 resultó en 2030 pero pasando 80 devuelto 1980 .

Además, debe tener sentido como fecha. Esto es lo que sucede si utilizo un día no válido:

SELECT EXTRACT(YEAR FROM 20300135);

Resultado:

+-----------------------------+
| EXTRACT(YEAR FROM 20300135) |
+-----------------------------+
|                        NULL |
+-----------------------------+

Otros delimitadores

Puede utilizar otros delimitadores para la fecha. MariaDB es bastante indulgente cuando se trata de delimitadores en fechas. Aquí hay algunos ejemplos 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 salida 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

Fecha actual

Podemos pasar NOW() como argumento de fecha para usar la fecha actual:

SELECT 
    NOW(),
    EXTRACT(MONTH FROM NOW());

Resultado:

+---------------------+---------------------------+
| NOW()               | EXTRACT(MONTH FROM NOW()) |
+---------------------+---------------------------+
| 2021-05-16 10:06:21 |                         5 |
+---------------------+---------------------------+

Fechas no válidas

Cuando pasa una fecha inválida, EXTRACT() devuelve null :

SELECT EXTRACT(YEAR FROM 'Friday');

Resultado:

+-----------------------------+
| EXTRACT(YEAR FROM 'Friday') |
+-----------------------------+
|                        NULL |
+-----------------------------+

Unidad de fecha/hora no válida

Cuando se pasa una unidad de fecha/hora no válida, EXTRACT() devuelve un error:

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 faltante

Llamando a EXTRACT() sin pasar ningún argumento da como resultado un error:

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