AUTOR: Ariel Ibáñez Gabás
En ocasiones, algunas consultas u operaciones LMD deben sumar (o restar) días a una fecha concreta, que normalmente es el campo de una tabla como la fecha de nacimiento, de contratación, de alta en el sitio web...
Aunque lo más natural para operar con este tipo de datos sea pensar que el operador '+' va a sumar correctamente los días a una fecha, esto no es correcto y generará resultados inesperados y erróneos si se trabaja con MySQL como SGBD. Esta limitación no es un problema si se utilizan otros gestores, que sí lo permiten.
SQL dispone de un tipo específico para describir fechas, el tipo DATE
(aunque existen otros tipos, funcionan de manera similar). El problema es que, en MySQL, la fecha no será tratada como un tipo DATE
por el operador '+', sino que será tratado como un número entero; p.ej., la fecha 2024-04-30
, será convertida al número 2020430
. Tener esto en mente ayuda a entender por qué se obtienen resultados extraños en los siguientes ejemplos.
Consideremos la siguiente tabla:
Fechas +---------------+ | fecha | +---------------+ | 2024-04-30 | | 2025-05-01 | +---------------+
Como se ve, las siguientes expresiones no devuelven el resultado que se pretende (vemos un extraño 31 de abril o que se añade un mes en lugar de 100 días):
Fechas +------------+-----------+-------------+ | fecha | fecha + 1 | fecha + 100 | +------------+-----------+-------------+ | 2024-04-30 | 20240431 | 20240530 | | 2025-05-01 | 20250502 | 20250601 | +------------+-----------+-------------+
MySQL ofrece dos formas se añadir intervalos de tiempo a una fecha: usar funciones de fecha y la cláusula INTERVAL
.
Utilización de funciones de fecha en MySQL
Un par de funciones aplicables al caso que nos ocupa son adddate(DATE, int)
y subdate(DATE, int)
, que reciben una fecha como primer parámetro, y un entero que representa los días que se añaden o sustraen, respectivamente. Corrigiendo el ejemplo citado:
select fecha,
adddate(fecha, 1) "+1 día",
adddate(fecha, 100) "+100 días"
from fechas;
Fechas +------------+------------+------------+ | fecha | +1 día | +100 días | +------------+------------+------------+ | 2024-04-30 | 2024-05-01 | 2024-08-08 | | 2025-05-01 | 2025-05-02 | 2025-08-09 | +------------+------------+------------+
Utilización de INTERVAL en MySQL
Otra manera que existe de operar con las fechas en MySQL es utilizar a continuación del operador '+' (o '-') la cláusula INTERVAL
, seguida de un número entero y de la unidad que se quiere sumar (o restar). La unidad puede ser DAY
, MONTH
, etc. En la siguiente URL puedes consultar una lista completa de las unidades admitidas: https://dev.mysql.com/doc/refman/8.0/en/expressions.html#temporal-intervals. El ejemplo anterior se puede reescribir de la siguiente manera utilizando INTERVAL
:
select fecha,
fecha + interval 1 day as "+1 día",
fecha + interval 10 day as "+10 días",
fecha + interval 10 month as "+10 meses"
from fechas;
Fechas +------------+------------+------------+------------+ | fecha | +1 día | +10 días | +10 meses | +------------+------------+------------+------------+ | 2024-04-30 | 2024-05-01 | 2024-05-10 | 2025-02-28 | | 2025-05-01 | 2025-05-02 | 2025-05-11 | 2026-03-01 | +------------+------------+------------+------------+
No hay comentarios:
Publicar un comentario