Lecciones del módulo (2/4)
Funciones de fecha y hora (timestamp)
Las fechas y las marcas de tiempo están en todas partes: pedidos, inicios de sesión, eventos, facturación. en En esta lección vemos cómo extraer partes de una fecha (año, mes…), truncarlo a una granularidad (mes, semana...), calcular intervalos y diferencias, y hacer comparaciones entre períodos.
Los tipos básicos
PostgreSQL distingue:
DATE— sólo fecha, formatoYYYY-MM-DD;TIMESTAMP— fecha + hora, sin zona horaria;TIMESTAMPTZ— fecha + hora + zona horaria;INTERVAL— un punto (por ejemplo,'3 days','2 hours 30 minutes').
En nuestro conjunto de datos ecommerce:
| Columna | Tipo |
|---|---|
| CÓDIGOPH0 | CÓDIGOPH1 |
| CÓDIGOPH2 | CÓDIGOPH3 |
| CÓDIGOPH4 | TIMESTAMP (puede ser NULL) |
EXTRACTO — leyendo una parte
EXTRACT(part FROM date) extrae un número:
SELECT EXTRACT(YEAR FROM ordered_at) AS year,
EXTRACT(MONTH FROM ordered_at) AS month,
EXTRACT(DOW FROM ordered_at) AS day_of_week -- 0=domenica
FROM orders;Las partes más utilizadas: YEAR, MONTH, DAY, HOUR, MINUTE, DOW (día
de la semana 0-6), DOY (día del año).
DATE_TRUNC — redondeando hacia abajo
DATE_TRUNC('part', date) "trunca" la fecha a una granularidad. es
esencial para agregar por mes, semana, hora:
-- Tutti gli ordini fatti in "marzo 2025" cadono nello stesso bucket:
SELECT DATE_TRUNC('month', ordered_at) AS month,
COUNT(*) AS order_count
FROM orders
GROUP BY month
ORDER BY month;Partes válidas: 'year', 'quarter', 'month', 'week', 'day',
CÓDIGOPH5, CÓDIGOPH6, CÓDIGOPH7.
Para facilitar la lectura, las personas suelen enviar DATE cuando no necesitan tiempo:
CÓDIGOPH1.
Diferencias e intervalos
Restar dos TIMESTAMP produce un INTERVAL:
SELECT id,
shipped_at - ordered_at AS wait_time
FROM orders
WHERE shipped_at IS NOT NULL;Comparaciones con un literal INTERVAL:
WHERE shipped_at - ordered_at > INTERVAL '1 day'Agregar días a una fecha:
SELECT signed_up_on + INTERVAL '30 days' AS trial_expiration
FROM customers;Pruébalo
Cuente cuántos pedidos se realizaron por año. Dos columnas: año (entero) y order_count. Ordenar por año de forma ascendente.
Mostrar pista
EXTRACT(YEAR FROMorder_at) devuelve un NUMÉRICO: conviértalo a int con ::int para facilitar la lectura.
Solución disponible después de 3 intentos
Ejercicio de revisión
Para cada mes de 2024, muestre el primer día del mes (columna mes, de tipo fecha) y el número de pedidos. Orden por mes.
Mostrar pista
DATE_TRUNC('mes', ordenado_at) devuelve el primer día del mes como marca de tiempo; ::date lo convierte a la fecha.
Solución disponible después de 3 intentos