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.
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;| dias | horas |
|---|---|
| 3.5 | 84.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.
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.
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.
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
| Motor | Días | Horas/otras unidades | Detalle clave |
|---|---|---|---|
| PostgreSQL | date - date | timestamp - timestamp → interval | age() es simbólico. |
| MySQL | DATEDIFF(fin,inicio) | TIMESTAMPDIFF(unidad,inicio,fin) | DATEDIFF ignora la hora. |
| SQL Server | DATEDIFF(datepart,inicio,fin) | Cuenta límites de la unidad. | |
| SQLite | julianday(fin)-julianday(inicio) | unixepoch para segundos | timediff() 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
Calcula la duración de tres sesiones
Devuelve el nombre y las horas transcurridas entre inicio y fin usando unixepoch().
3600.0 para obtener horas con decimales.Solución razonada
WITH sesiones(nombre, inicio, fin) AS (
VALUES
('Carga', '2026-08-20 09:00:00', '2026-08-20 12:30:00'),
('Informe', '2026-08-21 08:15:00', '2026-08-21 10:15:00'),
('Backup', '2026-08-22 23:00:00', '2026-08-23 01:30:00')
)
SELECT
nombre,
(unixepoch(fin) - unixepoch(inicio)) / 3600.0 AS horas
FROM sesiones
ORDER BY nombre;Las duraciones son 2,5 h para Backup, 3,5 h para Carga y 2 h para Informe. La resta se hace en segundos y solo después se convierte de unidad.
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
DATEDIFFdeTIMESTAMPDIFF. - SQL Server
DATEDIFFcuenta límites de unidad; SQLite ofrece diferencias numéricas conjulianday/unixepoch.
Conceptos relacionados
Fuentes técnicas consultadas
- PostgreSQL: Date/Time Functions and Operators
- MySQL 8.4: Date and Time Functions
- SQLite: Date And Time Functions
- SQL Server: DATEDIFF
Si necesitas seleccionar registros dentro de un periodo, consulta cómo filtrar entre dos fechas con WHERE, con límites y ejemplos por motor.