Aritmética de fechas e intervalos
Sumar o restar periodos y calcular diferencias entre fechas.
Aritmética de fechas e intervalos es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding Interview Prep incluye 4 lecciones en total.
Por qué los cálculos de fechas aparecen en las entrevistas
La aritmética de fechas es una de las habilidades de SQL más prácticas, por lo que los entrevistadores recurren mucho a ella para puestos de analista y backend. Casi todas las preguntas de negocio tienen un componente temporal: últimos 30 días, pedidos por semana, días desde el registro.
El inconveniente es que las funciones de fecha son la parte menos estandarizada de SQL. La misma operación tiene una sintaxis diferente en PostgreSQL, MySQL y SQL Server. Un buen candidato expone primero la idea con claridad y después adapta la sintaxis al dialecto.
- Sumar o restar un período
- Calcular la diferencia entre dos fechas
- Trabajar con valores de tipo
INTERVAL
El tipo INTERVAL
En PostgreSQL y en el estándar SQL, un período de tiempo es un valor de primera clase llamado interval. Se suma a una fecha o marca de tiempo mediante los operadores + y - habituales.
Esta es la forma más clara de expresar "hace 30 días" o "dentro de 3 meses", y les encanta a los entrevistadores porque se lee como lenguaje natural.
SELECT
CURRENT_DATE,
CURRENT_DATE + INTERVAL '7 days' AS next_week,
CURRENT_DATE - INTERVAL '1 month' AS last_month,
NOW() + INTERVAL '90 minutes' AS soon;Sumar períodos entre dialectos
Los entrevistadores suelen preguntar: "¿cómo sumaría 7 días en MySQL frente a SQL Server?" Conocer los tres dialectos principales demuestra experiencia real.
- PostgreSQL:
d + INTERVAL '7 days' - MySQL:
DATE_ADD(d, INTERVAL 7 DAY) - SQL Server:
DATEADD(day, 7, d)
El concepto es idéntico; solo cambia la forma de escribirlo. Indique siempre el dialecto para el que está escribiendo.
-- MySQL
SELECT DATE_ADD(order_date, INTERVAL 7 DAY) AS due_date FROM orders;
-- SQL Server
SELECT DATEADD(day, 7, order_date) AS due_date FROM orders;Diferencia entre dos fechas
La otra mitad de la aritmética de fechas consiste en calcular qué distancia hay entre dos fechas. El resultado depende de la unidad y del dialecto.
En PostgreSQL, restar dos valores de tipo date produce directamente un número entero de días. Restar dos valores de tipo timestamp produce un intervalo.
-- Postgres: date - date returns an integer (days)
SELECT shipped_date - order_date AS days_to_ship
FROM orders;DATEDIFF y sus trampas
DATEDIFF existe en MySQL y SQL Server, pero se comporta de forma diferente, un detalle engañoso muy habitual en las entrevistas.
- MySQL:
DATEDIFF(end, start)devuelve únicamente días completos. - SQL Server:
DATEDIFF(unit, start, end)recibe una unidad y cuenta cambios de límite, no unidades completas.
Ese comportamiento con los límites es importante: DATEDIFF(year, '2023-12-31', '2024-01-01') en SQL Server devuelve 1, aunque solo haya transcurrido un día.
-- SQL Server: counts boundaries, not elapsed time
SELECT DATEDIFF(year, '2023-12-31', '2024-01-01'); -- 1
SELECT DATEDIFF(day, '2023-12-31', '2024-01-01'); -- 1Calcular correctamente la edad en años
"Calcule la edad de un cliente en años" es una pregunta clásica. Dividir la diferencia de días entre 365 introduce desviaciones debido a los años bisiestos. PostgreSQL tiene AGE(), que devuelve un intervalo de calendario real.
Para obtener un número entero de años claro, extraiga la parte correspondiente a los años de la edad.
-- Postgres
SELECT
birth_date,
AGE(CURRENT_DATE, birth_date) AS exact_age,
EXTRACT(YEAR FROM AGE(CURRENT_DATE, birth_date)) AS age_years
FROM customers;Ejemplo práctico: pedidos de los últimos 30 días
Es un filtro casi universal en las entrevistas. La forma correcta consiste en comparar la columna de fecha con un límite calculado, no en envolver la columna en una función.
Comparar order_date con un límite constante permite utilizar cualquier índice sobre order_date. Más adelante volveremos sobre este aspecto de los índices.
SELECT COUNT(*) AS recent_orders
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days';Rangos semiabiertos para un mes natural
Cuando le pidan "todos los pedidos de marzo de 2024", evite BETWEEN '2024-03-01' AND '2024-03-31' en una columna de marcas de tiempo. Esto omite las filas de las 23:00 del 31 de marzo y es propenso a errores de desfase de un día.
El patrón robusto es un intervalo semiabierto: >= para el inicio y < para el inicio del mes siguiente. Funciona con cualquier precisión de columna.
SELECT *
FROM orders
WHERE order_ts >= DATE '2024-03-01'
AND order_ts < DATE '2024-04-01';EXTRACT y las partes de una fecha
Extraer un solo componente de una fecha es una tarea constante en los informes. La función estándar es EXTRACT(part FROM d), compatible con PostgreSQL y MySQL.
EXTRACT(YEAR FROM d),MONTH,DAYEXTRACT(DOW FROM d)para el día de la semana- SQL Server utiliza
DATEPART(weekday, d)en su lugar
Nota: extraer únicamente MONTH agrupa los meses de marzo de años diferentes, que rara vez es lo que desea.
SELECT
EXTRACT(YEAR FROM order_ts) AS yr,
EXTRACT(MONTH FROM order_ts) AS mo,
COUNT(*) AS n
FROM orders
GROUP BY 1, 2
ORDER BY 1, 2;Ejemplo avanzado: días hasta el próximo cumpleaños
Un problema de aritmética más difícil que combina extracción y suma. Construya el cumpleaños de este año a partir del mes y el día de nacimiento y, si ya ha pasado, páselo al año siguiente.
Explicarlo paso a paso en voz alta demuestra al entrevistador que sabe razonar sobre casos límite, como un cumpleaños que ya haya ocurrido este año.
-- Postgres
SELECT
name,
CASE
WHEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
EXTRACT(MONTH FROM birth_date)::int,
EXTRACT(DAY FROM birth_date)::int) >= CURRENT_DATE
THEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
EXTRACT(MONTH FROM birth_date)::int,
EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
ELSE MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int + 1,
EXTRACT(MONTH FROM birth_date)::int,
EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
END AS days_until
FROM customers;Primer y último día del mes
"Dígame el último día del mes de cada pedido" comprueba si recurre a una función integrada o intenta reinventarla. PostgreSQL combina DATE_TRUNC con operaciones de intervalos; MySQL tiene directamente LAST_DAY().
El truco para obtener el último día en Postgres es truncar al inicio del mes, sumar un mes y restar un día.
-- Postgres
SELECT
DATE_TRUNC('month', order_ts) AS month_start,
DATE_TRUNC('month', order_ts) + INTERVAL '1 month - 1 day' AS month_end
FROM orders;
-- MySQL: LAST_DAY(order_ts)Comprobación rápida
Ponga a prueba su comprensión del comportamiento de las diferencias de fechas entre dialectos.
Resumen: aritmética de fechas e intervalos
Ideas clave para la entrevista:
- Utilice valores
INTERVALcon+/-en Postgres;DATE_ADD/DATEDIFFen MySQL;DATEADD/DATEDIFFen SQL Server. - SQL Server DATEDIFF cuenta cambios de límite, no unidades transcurridas: es el principal detalle engañoso.
- Para calcular la edad en años, extraiga el valor de
AGE()en lugar de dividir los días entre 365. - Filtre las filas recientes comparando la columna con un límite calculado y utilice rangos semiabiertos (
>= start AND < next) para los intervalos mensuales.
Exponga primero el concepto y después adapte el dialecto.
Preguntas frecuentes
¿La lección «Aritmética de fechas e intervalos» es gratis?
Sí — el texto completo de «Aritmética de fechas e intervalos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding Interview Prep incluye 4 lecciones en total.
¿Qué aprenderé en «Aritmética de fechas e intervalos»?
Sumar o restar periodos y calcular diferencias entre fechas. Practicas Coding Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Coding Interview Prep?
No se requiere experiencia previa. Coding Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Aritmética de fechas e intervalos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Coding Interview Prep?
Sí. Cada lección de Coding Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Aritmética de fechas e intervalos
- Truncar y agrupar fechas por intervalos
- Analizar y dar formato a cadenas
- Zonas horarias y marcas de tiempo