SQL · fechas y dialectos

Sumar y restar fechas en SQL

Mueve una fecha o timestamp por días, meses u horas sin tratar el tiempo como un número cualquiera, y adapta el patrón al dialecto real de tu base de datos.

Lectura: 7–9 minSQL comprobadoPráctica con pistas
Contenido de esta guía

Respuesta rápida

No existe una única sintaxis portable para sumar o restar intervalos temporales en todos los motores. La intención es la misma, pero cada dialecto expresa el desplazamiento de forma diferente.

Formas habituales por motor
MotorSumar 30 días
PostgreSQLfecha + INTERVAL '30 days'
MySQLDATE_ADD(fecha, INTERVAL 30 DAY)
SQL ServerDATEADD(day, 30, fecha)
SQLitedate(fecha, '+30 days')

Elige la variante de tu motor y comprueba el tipo devuelto. Sumar días, meses y horas no siempre tiene las mismas reglas en los límites de mes o alrededor de cambios de zona horaria.

Modelo mental: desplaza un valor temporal con una unidad explícita

«Sumar 30» a una fecha no expresa por sí solo si hablas de días, horas o meses. Una operación temporal debe dejar clara la unidad y el valor de partida. Eso evita confundir aritmética de fechas con aritmética numérica.

Para plazos de negocio, pregunta además si necesitas días naturales, meses de calendario o una duración exacta de horas. No son intercambiables en todos los casos.

Ejemplo comprobado en SQLite: fecha de revisión 30 días después

SQLite
SELECT
  id,
  nombre,
  fecha_registro,
  date(fecha_registro, '+30 days') AS revision
FROM clientes
ORDER BY id
LIMIT 5;
Resultado comprobado en SQLite 3.46.1
idnombrefecha_registrorevision
1Ana Torres2025-01-082025-02-07
2Luis Martín2025-01-122025-02-11
3Marta Ruiz2025-02-012025-03-03
4Diego López2025-02-142025-03-16
5Sara Gómez2025-03-032025-04-02

El modificador '+30 days' se aplica al valor de fecha_registro. Para restar, usa un desplazamiento negativo como '-7 days'.

La misma intención en PostgreSQL, MySQL y SQL Server

PostgreSQL

INTERVAL
SELECT fecha_registro + INTERVAL '30 days' AS revision
FROM clientes;

PostgreSQL define tipos interval y operadores temporales. Al sumar un intervalo con hora a un date, el resultado puede convertirse en timestamp.

MySQL

DATE_ADD / DATE_SUB
SELECT DATE_ADD(fecha_registro, INTERVAL 30 DAY) AS revision
FROM clientes;

SELECT DATE_SUB(fecha_registro, INTERVAL 7 DAY) AS semana_anterior
FROM clientes;

SQL Server

DATEADD
SELECT DATEADD(day, 30, fecha_registro) AS revision
FROM clientes;

SELECT DATEADD(day, -7, fecha_registro) AS semana_anterior
FROM clientes;

No copies una variante en otro motor esperando que sea equivalente. El nombre de la función, la forma del intervalo y los tipos temporales son parte del dialecto.

Meses y años: el borde del calendario importa

Un mes no tiene una cantidad fija de días. Por eso «31 de enero + 1 mes» obliga al motor a resolver una fecha que quizá no exista en febrero. PostgreSQL y MySQL documentan reglas de ajuste al final del mes; SQLite expone modificadores y opciones como ceiling/floor para resolver ambigüedades en desplazamientos por meses o años.

Para plazos legales o de facturación, no asumas la regla. Decide qué significa «un mes después» en tu negocio, crea casos de prueba para fin de mes y años bisiestos, y documenta el comportamiento del motor.

Días de calendario y 24 horas pueden diferir

Con timestamps que incluyen zona horaria, un «día» de calendario y 24 horas exactas pueden producir horas locales diferentes al atravesar un cambio de horario estacional. PostgreSQL lo documenta explícitamente para timestamp with time zone. Si tu aplicación opera con zonas horarias, separa el requisito de calendario del requisito de duración.

Guardar fechas ambiguas como texto y luego hacer aritmética

Un texto como 03/04/2026 puede interpretarse de varias formas. Usa tipos temporales reales cuando el motor los ofrezca o formatos inequívocos en SQLite, y valida la zona horaria cuando forme parte del significado.

Práctica: calcula una fecha de seguimiento

Básica · fechas

Añade 14 días a la fecha de cada pedido

En SQLite, devuelve id, fecha y una columna seguimiento que sea 14 días posterior. Muestra los cinco primeros pedidos por id.

Qué debes recordar

  • La aritmética temporal necesita una unidad explícita.
  • PostgreSQL, MySQL, SQL Server y SQLite expresan la operación de formas diferentes.
  • Meses/años tienen bordes de calendario; prueba finales de mes y años bisiestos.
  • Un día de calendario no siempre equivale a 24 horas cuando intervienen zonas horarias.

Conceptos relacionados

Fuentes técnicas consultadas

Las referencias oficiales se usaron para contrastar sintaxis, unidades y casos límite.