Fechas SQL · diferencias por motor

Diferencia entre fechas en SQL: días, horas y meses

Calcular cuánto tiempo hay entre dos fechas no tiene una sintaxis universal. PostgreSQL usa resta e intervalos, MySQL ofrece DATEDIFF/TIMESTAMPDIFF, SQL Server usa DATEDIFF y SQLite permite restar julianday() o unixepoch().

Lectura: 7–9 min4 motores comparadosPráctica con pistas
Contenido de esta guía

Respuesta rápida

Primero decide qué significa diferencia: días exactos transcurridos, segundos, meses de calendario o una descripción humana como «1 mes y 3 días». Luego usa la función u operador del motor. No intercambies estas métricas: un mes no tiene siempre el mismo número de días y SQL Server DATEDIFF cuenta límites de unidad cruzados, no necesariamente duración física completa.

SQLite: julianday() o unixepoch() para diferencias precisas

SQLite documenta timediff() para una diferencia legible, pero recomienda restar julianday() o unixepoch() cuando necesitas un número preciso de días o segundos.

84 horas = 3,5 días
SELECT
  ROUND(
    julianday('2026-08-23 18:00:00') -
    julianday('2026-08-20 06:00:00'),
    2
  ) AS dias,
  (unixepoch('2026-08-23 18:00:00') -
   unixepoch('2026-08-20 06:00:00')) / 3600.0 AS horas;
Resultado comprobado en SQLite 3.46.1
diashoras
3.584.0

PostgreSQL: resta directa e intervalos

En PostgreSQL, restar dos valores date devuelve un entero con días. Restar dos timestamp devuelve un interval. Si buscas una diferencia simbólica en años, meses y días, age() tiene otra semántica.

PostgreSQL
SELECT DATE '2026-08-23' - DATE '2026-08-20' AS dias;

SELECT
  TIMESTAMP '2026-08-23 18:00:00' -
  TIMESTAMP '2026-08-20 06:00:00' AS intervalo;

La primera consulta produce 3 días. La segunda representa 3 días y 12 horas como intervalo.

MySQL: DATEDIFF para días, TIMESTAMPDIFF para unidades

DATEDIFF(fin, inicio) usa únicamente la parte de fecha y devuelve días. Para horas, minutos, meses u otras unidades, TIMESTAMPDIFF(unidad, inicio, fin) devuelve un entero en la unidad indicada.

MySQL 8.4
SELECT DATEDIFF('2026-08-23', '2026-08-20') AS dias;

SELECT TIMESTAMPDIFF(
  HOUR,
  '2026-08-20 06:00:00',
  '2026-08-23 18:00:00'
) AS horas;

Con esos valores, las respuestas son 3 días y 84 horas.

SQL Server: DATEDIFF cuenta límites de datepart

SQL Server define DATEDIFF(datepart, inicio, fin) como el número de límites de la unidad indicados que se cruzan entre ambos valores. Esa definición importa: dos instantes separados por una fracción mínima pueden devolver 1 para day si atraviesan medianoche.

SQL Server
SELECT DATEDIFF(
  hour,
  '2026-08-20T06:00:00',
  '2026-08-23T18:00:00'
) AS horas;

Para intervalos grandes con unidades muy pequeñas existe DATEDIFF_BIG. Si necesitas duración física precisa, define primero la unidad y revisa cómo intervienen zona horaria y tipos de fecha/hora.

Tabla de decisión

MotorDíasHoras/otras unidadesDetalle clave
PostgreSQLdate - datetimestamp - timestamp → intervalage() es simbólico.
MySQLDATEDIFF(fin,inicio)TIMESTAMPDIFF(unidad,inicio,fin)DATEDIFF ignora la hora.
SQL ServerDATEDIFF(datepart,inicio,fin)Cuenta límites de la unidad.
SQLitejulianday(fin)-julianday(inicio)unixepoch para segundostimediff() es legible, no la medida numérica precisa.

Errores frecuentes

Usar «meses» como si fueran bloques fijos de 30 días

Los meses varían. Decide si quieres meses de calendario completos, días transcurridos o una representación simbólica.

Intercambiar el orden de inicio y fin

MySQL DATEDIFF usa fin - inicio, mientras TIMESTAMPDIFF recibe primero inicio y después fin. Documenta la convención en tu consulta.

Práctica: horas transcurridas en SQLite

Intermedia · fechas

Calcula la duración de tres sesiones

Devuelve el nombre y las horas transcurridas entre inicio y fin usando unixepoch().

Qué debes recordar

  • No existe una única sintaxis portable para diferencias temporales.
  • Define primero si necesitas días, segundos, meses de calendario o un intervalo simbólico.
  • PostgreSQL distingue resta de fechas y de timestamps.
  • MySQL separa DATEDIFF de TIMESTAMPDIFF.
  • SQL Server DATEDIFF cuenta límites de unidad; SQLite ofrece diferencias numéricas con julianday/unixepoch.

Conceptos relacionados

Fuentes técnicas consultadas

Si necesitas seleccionar registros dentro de un periodo, consulta cómo filtrar entre dos fechas con WHERE, con límites y ejemplos por motor.