Fechas y horassolo PostgreSQL

DATE_TRUNC

Recorta una fecha y hora al inicio del año, mes, semana, día u hora.

Sintaxis

DATE_TRUNC('<unidad>', <momento>)

Descarta todo lo que es más pequeño que la unidad indicada: 'month' convierte cualquier momento del mes en su día 1 a las 00:00. Unidades: 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute'. Lo más habitual es usarla para agrupar datos por meses o por días.

Datos para los ejemplos

orders

idcreated_atamount
12026-07-03 10:15:00120.50
22026-07-28 18:40:0080.25
32026-08-09 09:05:00199.99
42026-08-21 14:30:0045.00
52026-09-02 11:00:0064.75

Estas tablas ya están creadas en el entorno de pruebas y los ejemplos de abajo las usan. ¿Quieres repetirlo en tu propia base de datos? Copia el SQL.

Un mismo momento, distintas unidades
SELECT DATE_TRUNC('month', TIMESTAMP '2026-09-13 15:47') AS month_start,
DATE_TRUNC('day', TIMESTAMP '2026-09-13 15:47') AS day_start,
DATE_TRUNC('hour', TIMESTAMP '2026-09-13 15:47') AS hour_start;
month_startday_starthour_start
2026-09-01 00:00:002026-09-13 00:00:002026-09-13 15:00:00
Cada pedido recortado al inicio de su mes
SELECT id, created_at,
DATE_TRUNC('month', created_at) AS month
FROM orders;
idcreated_atmonth
12026-07-03 10:15:002026-07-01 00:00:00
22026-07-28 18:40:002026-07-01 00:00:00
32026-08-09 09:05:002026-08-01 00:00:00
42026-08-21 14:30:002026-08-01 00:00:00
52026-09-02 11:00:002026-09-01 00:00:00
Pedidos por meses
SELECT DATE_TRUNC('month', created_at) AS month,
COUNT(*) AS order_count,
SUM(amount) AS revenue
FROM orders
GROUP BY month
ORDER BY month;
monthorder_countrevenue
2026-07-01 00:00:002200.75
2026-08-01 00:00:002244.99
2026-09-01 00:00:00164.75

Ten en cuenta

La semana empieza el lunes: DATE_TRUNC('week', …) para el domingo 13 de septiembre devuelve el lunes 7 de septiembre.

Si pasas un date, el resultado es timestamp with time zone, y su aspecto depende de la zona horaria. Si necesitas una fecha sin más, añade ::date: DATE_TRUNC('month', DATE '2026-09-13')::date.

Para agrupar por meses, usa DATE_TRUNC y no EXTRACT(MONTH FROM …): si no, septiembre de años distintos se junta en una sola fila.

Funciones relacionadas

Más detalles en el curso