0Pricing
SQL Interview Prep · Lección

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 SQL 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 SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL 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'); -- 1

Calcular 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, DAY
  • EXTRACT(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 INTERVAL con +/- en Postgres; DATE_ADD/DATEDIFF en MySQL; DATEADD/DATEDIFF en 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 SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL 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 SQL 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 SQL Interview Prep?

No se requiere experiencia previa. SQL 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 SQL Interview Prep?

Sí. Cada lección de SQL 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

  1. Aritmética de fechas e intervalos
  2. Truncar y agrupar fechas por intervalos
  3. Analizar y dar formato a cadenas
  4. Zonas horarias y marcas de tiempo
← Volver a SQL Interview Prep