Sumar días a una fecha en MySQL

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):

MAL
select fecha, fecha + 1, fecha + 100
from fechas;
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:

BIEN
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:

BIEN
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