Saltar al contenido principal
eLearner.app
Módulo 6 · Lección 2 de 422/57 en el curso~12 min
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, formato YYYY-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:

ColumnaTipo
CÓDIGOPH0CÓDIGOPH1
CÓDIGOPH2CÓDIGOPH3
CÓDIGOPH4TIMESTAMP (puede ser NULL)

EXTRACTO — leyendo una parte

EXTRACT(part FROM date) extrae un número:

SQL
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:

SQL
-- 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:

SQL
SELECT id,
       shipped_at - ordered_at AS wait_time
FROM   orders
WHERE  shipped_at IS NOT NULL;

Comparaciones con un literal INTERVAL:

SQL
WHERE  shipped_at - ordered_at > INTERVAL '1 day'

Agregar días a una fecha:

SQL
SELECT signed_up_on + INTERVAL '30 days' AS trial_expiration
FROM   customers;

Pruébalo

Ejercicio#sql.m6.l2.e1
Intentos: 0Cargando...

Cuente cuántos pedidos se realizaron por año. Dos columnas: año (entero) y order_count. Ordenar por año de forma ascendente.

Cargando editor...
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

Ejercicio#sql.m6.l2.e2
Intentos: 0Cargando...

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.

Cargando editor...
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