Tema SQL
DATEDIFF() (SQL Server)
Diferencia entera entre dos fechas según datepart (DATEDIFF(unit, inicio, fin)). La semántica no coincide con TIMESTAMPDIFF de MySQL: revisa orden y bordes de mes.
Descripción
DATEDIFF ( datepart , startdate , enddate ) cuenta unidades enteras según el datepart (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, MILLISECOND, etc.). Para fracciones de día usa DAY u horas según necesidad; DATEDIFF(MONTH, …) cuenta meses de calendario, no 30 días fijos. DATEDIFF_BIG existe para resultados que pueden desbordar INT. Ojo: el comportamiento en bordes de mes/año y horario de verano puede sorprender si no fijas reglas de negocio. En MySQL TIMESTAMPDIFF(unidad, ini, fin) usa otra convención de unidades y redondeo: no portes la expresión sin revisar.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
DATEDIFF(datepart, fecha_inicio, fecha_fin)
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- datepart
- YEAR, QUARTER, MONTH, DAY, WEEK, HOUR, MINUTE, SECOND, MILLISECOND, MICROSECOND (según versión).
- Límites
- Cuenta cruces de frontera del datepart, no diferencia física continua en todos los casos.
- MySQL
- TIMESTAMPDIFF: revisa orden de argumentos y unidades admitidas.
Ejemplos
Ejemplo 1
SELECT DATEDIFF(DAY, '2026-01-01', '2026-01-10') AS dias;
-- 9
SELECT DATEDIFF(HOUR, inicio, fin) AS horas
FROM sesiones;
Ejemplo 2
SELECT DATEDIFF(MONTH, fecha_alta, GETDATE()) AS meses_alta
FROM socios;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.