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