¿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é.
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 duckdb
print(duckdb.sql("SELECT DATE '2026-06-30' - DATE '2026-01-01' AS dias").fetchone()[0])
Adivinar está bien: se guarda tal como la escribiste para compararla. Solo tú y tu Maestro ven tus predicciones.
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 "¿en cuántos meses distintos estuvo activa la cuenta?", sirve date_diff. 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_venir
FROM 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.
Cuenta los clientes dormidos: los que al 30 de junio de 2026 llevan más de 90 días sin venir.
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 |
Cada ejecución empieza con copias nuevas de las tablas del curso, así que puedes probar lo que quieras. Tab agrega sangría; para salir del editor, presiona Escape y luego Tab.
Listo para ejecutar tu consulta.
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.
Calcula los días entre fechaalta y ultimavisita de cada cliente e imprime el nombre del que tiene más días y cuántos son.
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.
Ejecuta tu código para ver lo que imprime y el valor de su última expresión. Cada ejecución empieza de nuevo. Ctrl+Enter ejecuta tu código. Tab agrega sangría; para salir del editor, presiona Escape y luego Tab.
Listo para ejecutar tu código.
Ejecuta tu código para ver su salida aquí.
Datos: clientes-frecuentes, 24 filas
Enter guarda una celda y Escape la deja como estaba. Deja una celda vacía para un valor faltante.
| Fila | Quitar | |||||
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 | ||||||
| 4 | ||||||
| 5 | ||||||
| 6 | ||||||
| 7 | ||||||
| 8 | ||||||
| 9 | ||||||
| 10 | ||||||
| 11 | ||||||
| 12 | ||||||
| 13 | ||||||
| 14 | ||||||
| 15 | ||||||
| 16 | ||||||
| 17 | ||||||
| 18 | ||||||
| 19 | ||||||
| 20 |