El entrenamiento dura una hora y media, la jornada laboral — 8 horas, la pausa — 20 minutos, y cocer huevos lleva 10 minutos. Todo esto va de intervalos de tiempo.
Los intervalos de tiempo son súper útiles en apps reales, por ejemplo, cuando necesitas calcular plazos de tareas, ver la diferencia entre dos fechas o sumar/restar tiempo. Pero antes de meternos en detalles, vamos a recordar brevemente dónde nos quedamos en las clases anteriores.
En PostgreSQL INTERVAL es un tipo de dato especial pensado para representar periodos de tiempo. A diferencia de otros tipos temporales, no guarda una fecha o una hora concreta, sino que describe un periodo, por ejemplo: "2 días", "3 horas", "5 minutos".
Sintaxis de INTERVAL
Puedes definir intervalos así:
INTERVAL 'número unidad_de_tiempo'
Ejemplos:
INTERVAL '2 days' -- Dos días
INTERVAL '3 hours' -- Tres horas
INTERVAL '15 minutes' -- Quince minutos
INTERVAL '1 day 2 hours' -- Un día y dos horas
PostgreSQL soporta varias unidades de tiempo: year, month, day, hour, minute, second. Puedes combinarlas en una sola expresión.
Usando intervalos en consultas
El tipo INTERVAL se vuelve especialmente útil cuando lo usas junto con otros tipos temporales (DATE, TIMESTAMP). Vamos a ver las operaciones básicas.
Sumar un intervalo a una fecha/hora
Puedes sumar intervalos a valores de fecha o de hora. Por ejemplo:
SELECT CURRENT_DATE + INTERVAL '7 days' AS delivery_date;
-- Obtenemos la fecha dentro de 7 días desde hoy
Resultado:
| delivery_date |
|---|
| 2023-10-08 |
Restar intervalos de una fecha/hora
Además de sumar, también puedes restar intervalos:
SELECT NOW() - INTERVAL '2 hours' AS two_hours_ago;
-- Obtenemos la hora de hace dos horas
Resultado:
| two_hours_ago |
|---|
| 2023-10-01 10:00:00.000 |
Calcular la diferencia entre dos fechas
Una de las funciones potentes de INTERVAL es calcular la diferencia entre dos fechas:
SELECT '2023-10-15'::DATE - '2023-10-01'::DATE AS days_difference;
-- Cuántos días hay entre dos fechas
Resultado:
| days_difference |
|---|
| 14 days |
Ojo, el resultado aquí también es un intervalo de tiempo.
Ejemplos prácticos con INTERVAL
Calcular la fecha de entrega. Imagina una tienda online donde la entrega tarda de 3 a 7 días. Así puedes calcular las posibles fechas de entrega:
SELECT CURRENT_DATE + INTERVAL '3 days' AS earliest_delivery,
CURRENT_DATE + INTERVAL '7 days' AS latest_delivery;
Resultado:
| earliest_delivery | latest_delivery |
|---|---|
| 2023-10-04 | 2023-10-08 |
Controlando el tiempo de ejecución de una tarea. Supón que tienes una tabla tasks donde cada tarea tiene una fecha de inicio. Hay que calcular la fecha de fin de la tarea según su duración en horas:
CREATE TABLE tasks (
task_id SERIAL PRIMARY KEY,
task_name TEXT,
start_time TIMESTAMP,
duration INTERVAL
);
INSERT INTO tasks (task_name, start_time, duration)
VALUES
('Preparar informe', '2023-10-01 09:00:00', INTERVAL '4 hours'),
('Probar aplicación', '2023-10-01 10:00:00', INTERVAL '2 hours 30 minutes');
SELECT task_name,
start_time,
start_time + duration AS end_time
FROM tasks;
Resultado:
| task_name | start_time | end_time |
|---|---|---|
| Preparar informe | 2023-10-01 09:00:00 | 2023-10-01 13:00:00 |
| Probar aplicación | 2023-10-01 10:00:00 | 2023-10-01 12:30:00 |
Comparando tiempos de ejecución. A veces necesitas encontrar todas las tareas que se completaron en menos de 3 horas:
SELECT task_name
FROM tasks
WHERE duration < INTERVAL '3 hours';
Resultado:
| task_name |
|---|
| Probar aplicación |
Trucos útiles con intervalos
Cálculo dinámico de intervalos. Puedes combinar intervalos con otras operaciones. Por ejemplo, tomar el número de días de una columna y convertirlo en un intervalo:
SELECT CURRENT_DATE + (order_days || ' days')::INTERVAL AS order_due_date
FROM orders;
Convertir intervalos a texto. A veces necesitas convertir un intervalo a string para mostrarlo:
SELECT INTERVAL '2 days 3 hours'::TEXT AS interval_text;
Resultado:
| interval_text |
|---|
| 2 days 03:00:00 |
Errores comunes al trabajar con INTERVAL
Trabajar con INTERVAL, aunque es potente, puede dar algún quebradero de cabeza. Un error típico es usar el formato mal. Por ejemplo, si intentas INTERVAL '2 hours and 30 minutes', te dará error porque PostgreSQL no entiende la palabra "and". Lo correcto es: INTERVAL '2 hours 30 minutes'.
Otro fallo es olvidar poner la unidad de tiempo, como en INTERVAL '2'. PostgreSQL no sabe qué es ese "2", así que siempre pon la unidad (2 days, 2 hours).
GO TO FULL VERSION