¿Cuántos días o meses hay entre dos fechas en SQL y pandas?
Calcula los días entre dos fechas y elige entre date_diff y date_sub cuando la pregunta es en meses: fronteras del calendario o meses completos.
Curso gratis. Tu Maestro, una IA, .
Los clientes frecuentes
Café Altura tiene un programa de clientes frecuentes. La tabla clientes trae 24 clientes sintéticos con su fecha_nacimiento, su fecha_alta en el programa y su ultima_visita. Las tres columnas ya son fechas.
En este módulo, "hoy" es siempre el 30 de junio de 2026, el último día de ventas_diarias. Es a propósito: si un reporte usa la fecha del día en que lo corres, da otro resultado cada vez que lo corres. Escribe la fecha de referencia en la consulta y el resultado se puede repetir.
La pregunta más simple con dos fechas es cuánto tiempo pasó entre ellas. Predice.
Tres cuentas con fechas en DuckDB, desde Python. Escribe qué crees que imprime cada una y por qué.
Restar dos fechas
Ejemplo 1 de 3
import duckdbprint(duckdb.sql("SELECT DATE '2026-06-30' - DATE '2026-01-01' AS dias").fetchone()[0])Adivinar está bien. Lo que escribas se queda en este navegador y te espera en tu curso.
Ejemplo 2 de 3, se abre cuando expliques este
Fronteras o periodos completos
DuckDB tiene dos funciones que parecen la misma y responden preguntas distintas. Su documentación las define así:
date_diff(parte, inicio, fin)cuenta las fronteras de esa parte que hay entre las dos fechas: cuántos inicios de mes, de año o de día se cruzan.date_sub(parte, inicio, fin)cuenta cuántas partes completas caben, y descarta lo que sobra.
Para días dan lo mismo, y restar las fechas también. Para meses y años no. Si la pregunta es "¿cuántos inicios de mes cruzó el intervalo?", sirve date_diff. Para contar meses con actividad observada, cuenta los meses distintos de los eventos: las dos fechas extremas no demuestran actividad intermedia. Del 31 de enero al 1 de febrero se cruza una frontera, aunque el intervalo toca dos meses. Si es "¿cuántos meses completos lleva?", sirve date_sub. Y si la regla del negocio está en días ("inactivo después de 90 días"), cuenta días: tres meses no son 90 días. Si no sabes cuál usar para tu pregunta, pregúntale a tu Maestro.
Restar dos columnas de fechas da una duración; .dt.days la deja en días:
data["dias_en_programa"] = (data["ultima_visita"] - data["fecha_alta"]).dt.daysPara la fecha de referencia, usa pd.Timestamp("2026-06-30") en vez de la fecha de hoy.
SELECT nombre, ultima_visita - fecha_alta AS dias_en_programa, DATE '2026-06-30' - ultima_visita AS dias_sin_venirFROM clientes;date_diff('day', fecha_alta, ultima_visita) da lo mismo que la resta.
Inténtalo
Café Altura llama "dormido" a un cliente que no viene hace más de 90 días. La consulta de abajo los cuenta con date_diff('month', ...) > 3, que no es la regla. Cámbiala para que cuente días desde la última visita hasta el 30 de junio de 2026. Una buena respuesta cuenta 21 clientes; la consulta de meses cuenta 20.
Tu turno
Cuenta los clientes dormidos: los que al 30 de junio de 2026 llevan más de 90 días sin venir.
Tablas: clientes (cliente_id, nombre, fecha_nacimiento, fecha_alta, ultima_visita)
clientes · 24 filas
| Columna | Tipo |
|---|---|
| cliente_id | BIGINT |
| nombre | VARCHAR |
| fecha_nacimiento Fecha de nacimiento. | DATE |
| fecha_alta Día en que se inscribió al programa de clientes frecuentes. | DATE |
| ultima_visita Día de su visita más reciente. | DATE |
Primeras filas
| cliente_id | nombre | fecha_nacimiento | fecha_alta | ultima_visita |
|---|---|---|---|---|
| 1 | Ana Ruiz | 1990-07-01 | 2026-01-31 | 2026-02-01 |
| 2 | Beto Garza | 2000-02-29 | 2025-01-28 | 2025-06-15 |
| 3 | Carla Méndez | 1985-06-30 | 2024-02-06 | 2025-10-21 |
Tab agrega sangría; Esc y Tab para salir
Inténtalo sin ayuda
Ahora en pandas y desde cero: calcula cuántos días pasaron entre la fecha_alta y la ultima_visita de cada cliente, e imprime quién tiene más días y cuántos. Una buena respuesta da un solo nombre y un número entero de días, no una duración con horas. Si te sale algo como 100 days 00:00:00, pégale tu código a tu Maestro.
Tu turno
Calcula los días entre fecha_alta y ultima_visita de cada cliente e imprime el nombre del que tiene más días y cuántos son.
Datos: clientes-frecuentes, 24 filas
| Fila | Quitar | |||||
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 | ||||||
| 4 | ||||||
| 5 | ||||||
| 6 | ||||||
| 7 | ||||||
| 8 | ||||||
| 9 | ||||||
| 10 | ||||||
| 11 | ||||||
| 12 | ||||||
| 13 | ||||||
| 14 | ||||||
| 15 | ||||||
| 16 | ||||||
| 17 | ||||||
| 18 | ||||||
| 19 | ||||||
| 20 |
Enter guarda; Esc deshace; vacía es un valor faltante
Tab agrega sangría; Esc y Tab para salir
Comprueba lo que sabes: ¿Qué da date_diff('month', DATE '2026-03-31', DATE '2026-04-01')?