Trabajar con datos en el tiempo en bases de datos relacionales, como PostgreSQL, implica la gestión y análisis de valores que cambian o están asociados con una dimensión temporal. Esto es esencial para analizar tendencias, calcular valores históricos, realizar predicciones o comparar periodos.
A continuación, te explico cómo gestionar y analizar datos temporales, con ejemplos prácticos en PostgreSQL:
1. Tipos de datos temporales
En PostgreSQL, los principales tipos de datos para manejar tiempo son:
- DATE: Solo almacena la fecha (ej.
2025-01-24).
- TIME: Solo almacena la hora (ej.
14:30:00).
- TIMESTAMP: Fecha y hora sin zona horaria (ej.
2025-01-24 14:30:00).
- TIMESTAMPTZ: Fecha y hora con zona horaria (ej.
2025-01-24 14:30:00+00).
- INTERVAL: Representa una duración (ej.
2 days 3 hours).
2. Insertar y almacenar datos temporales
Ejemplo
Supongamos que tienes una tabla ventas para almacenar transacciones con una marca temporal:
CREATE TABLE ventas (
id SERIAL PRIMARY KEY,
producto VARCHAR(100),
cantidad INT,
precio DECIMAL(10, 2),
fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
- La columna
fecha almacena el momento en que se realiza la venta.
Insertar un registro:
INSERT INTO ventas (producto, cantidad, precio)
VALUES ('Laptop', 1, 2500.00);
3. Consultas temporales comunes
a) Filtrar por rango de fechas
Para encontrar ventas realizadas en un rango de fechas:
SELECT *
FROM ventas
WHERE fecha BETWEEN '2025-01-01' AND '2025-01-24';
b) Filtrar por periodos específicos
Ventas realizadas en un mes en particular:
SELECT *
FROM ventas
WHERE EXTRACT(MONTH FROM fecha) = 1 AND EXTRACT(YEAR FROM fecha) = 2025;
4. Agregaciones temporales
a) Agrupar por día
Sumar ventas por día:
SELECT DATE(fecha) AS dia, SUM(precio * cantidad) AS total_ventas
FROM ventas
GROUP BY DATE(fecha)
ORDER BY dia;
b) Agrupar por mes
SELECT DATE_TRUNC('month', fecha) AS mes, SUM(precio * cantidad) AS total_ventas
FROM ventas
GROUP BY DATE_TRUNC('month', fecha)
ORDER BY mes;
DATE_TRUNC: Trunca la fecha al inicio del mes, año, día, etc.
5. Calcular diferencias en el tiempo
a) Tiempo transcurrido entre eventos
Si necesitas calcular la diferencia entre fechas (por ejemplo, entre ventas):
SELECT id, producto, fecha,
fecha - LAG(fecha) OVER (ORDER BY fecha) AS tiempo_desde_ultima_venta
FROM ventas;
LAG: Devuelve el valor de la fila anterior dentro de la ventana.
b) Diferencias absolutas
Duración total entre dos fechas específicas:
SELECT '2025-01-24'::DATE - '2025-01-01'::DATE AS dias_transcurridos;
6. Funciones temporales útiles
a) Fecha actual
SELECT CURRENT_DATE; -- Solo la fecha actual
SELECT CURRENT_TIMESTAMP; -- Fecha y hora actual
b) Extraer partes de la fecha
SELECT EXTRACT(YEAR FROM fecha) AS anio,
EXTRACT(MONTH FROM fecha) AS mes,
EXTRACT(DAY FROM fecha) AS dia
FROM ventas;
c) Agregar o restar tiempo
Sumar o restar intervalos a una fecha:
SELECT fecha + INTERVAL '1 day' AS manana,
fecha - INTERVAL '7 days' AS semana_pasada
FROM ventas;
7. Consultas avanzadas
a) Ventas acumuladas
Para calcular el total acumulado de ventas a lo largo del tiempo:
SELECT fecha,
SUM(precio * cantidad) OVER (ORDER BY fecha) AS ventas_acumuladas
FROM ventas;
b) Ventas promedio móviles
Para calcular un promedio móvil de 7 días:
SELECT fecha,
AVG(precio * cantidad) OVER (ORDER BY fecha ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS promedio_movil
FROM ventas;
8. Indexación temporal
Para mejorar el rendimiento de consultas basadas en fechas, puedes crear índices:
CREATE INDEX idx_fecha ON ventas (fecha);
9. Aplicaciones comunes de datos temporales
- Análisis de tendencias: Identificar patrones de venta por días, semanas o meses.
- Predicciones: Basadas en datos históricos para anticipar futuras ventas o eventos.
- Alertas: Detectar retrasos o anomalías al monitorear eventos en tiempo real.