CodeGym /Cursos /SQL SELF /Trabajando con intervalos de tiempo: INTERVAL

Trabajando con intervalos de tiempo: INTERVAL

SQL SELF
Nivel 31 , Lección 4
Disponible

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).

1
Cuestionario/control
Trabajando con fechas y horas, nivel 31, lección 4
No disponible
Trabajando con fechas y horas
Trabajando con fechas y horas
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION