Fechas y horassolo PostgreSQL

AGE

Calcula cuánto tiempo ha pasado entre dos momentos, en años, meses y días.

Sintaxis

AGE(<momento posterior>, <momento anterior>)
AGE(<momento>)

Resta el segundo momento del primero y devuelve un intervalo en unidades conocidas —años, meses, días— en lugar de un simple número de días. Con un solo argumento, cuenta desde la fecha de hoy. De ahí el nombre: lo más habitual es calcular así la edad de una persona o su antigüedad.

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.

Cuánto tiempo ha pasado entre dos fechas
SELECT AGE(DATE '2026-09-13', DATE '1990-05-20') AS age;
age
36 years 3 mons 24 days

mons son meses: PostgreSQL muestra los intervalos con abreviaturas en inglés.

Solo los años completos
SELECT EXTRACT(YEAR FROM AGE(DATE '2026-09-13', DATE '1990-05-20')) AS full_years;
full_years
36
De cada pedido al final de septiembre
SELECT id, created_at,
AGE(TIMESTAMP '2026-09-30', created_at) AS time_left
FROM orders;
idcreated_attime_left
12026-07-03 10:15:002 mons 26 days 13:45:00
22026-07-28 18:40:002 mons 1 day 05:20:00
32026-08-09 09:05:001 mon 20 days 14:55:00
42026-08-21 14:30:001 mon 8 days 09:30:00
52026-09-02 11:00:0027 days 13:00:00

Ten en cuenta

Devuelve un intervalo, no un número. Compáralo con un intervalo —AGE(…) > INTERVAL '18 years'— y saca el número de años con EXTRACT(YEAR FROM AGE(…)).

Primero va el momento posterior y luego el anterior. Si los confundes, obtendrás un intervalo negativo: -36 years -3 mons -24 days.

Restar fechas sin más es otra cosa: DATE '2026-09-13' - DATE '1990-05-20' da un número de días, 13265, no años y meses.

Funciones relacionadas

Más detalles en el curso