AGE в SQL — разница между датами в годах, месяцах и днях

AGE возвращает разницу между двумя датами как интервал в символьном виде — «34 years 2 mons 11 days», а не просто число дней. Аналитику она удобна для возраста пользователей, стажа, «сколько прошло с события» в человеческих единицах. Ключевой нюанс диалектов: AGE — это функция PostgreSQL, её нет ни в SQLite, ни в MySQL. С одним аргументом AGE(x) считает разницу относительно текущей даги (current_date).

Синтаксис

AGE(timestamp, timestamp) -> interval -- разница между двумя датами AGE(timestamp) -> interval -- относительно CURRENT_DATE

Примеры использования

Пример 1: Возраст пользователей

SELECT id,
       AGE(CURRENT_DATE, birth_date) AS age
FROM users
LIMIT 2;

Результат:

id | age
---+-------------------------
1  | 34 years 2 mons 11 days
2  | 28 years 7 mons 3 days

Пример 2: Только полных лет числом

SELECT id,
       EXTRACT(YEAR FROM AGE(birth_date)) AS years
FROM users
LIMIT 2;

Результат:

id | years
---+------
1  | 34
2  | 28

Пример 3: Сколько прошло с заказа

SELECT id,
       AGE(NOW(), created_at) AS since_order
FROM orders
ORDER BY created_at
LIMIT 2;

Результат:

id | since_order
---+--------------------------
17 | 6 mons 12 days 04:15:00
23 | 6 mons 9 days 22:40:00
Порешать SQL-задачи в тренажёре →

Типичная ошибка

AGE возвращает interval, а не число: чтобы получить целое количество лет, оберните в EXTRACT(YEAR FROM AGE(...)). Не путайте с вычитанием: date - date даёт целое число дней, а AGE — символьный интервал из лет/месяцев/дней, учитывающий календарь. Функция только в PostgreSQL.

Где спрашивают на собеседовании

Спрашивают, когда нужно посчитать возраст или стаж; в паре с EXTRACT / DATE_PART (вытащить годы числом) и с типом INTERVAL.

FAQ: частые вопросы про AGE

Есть ли AGE в MySQL и SQLite?

Нет, это функция только PostgreSQL. В MySQL аналог — TIMESTAMPDIFF(YEAR, birth_date, NOW()) для числа лет. В SQLite считают через strftime или (julianday(a) - julianday(b)) для дней. Прямого эквивалента символьного интервала «годы-месяцы-дни» в них нет.

Чем AGE отличается от вычитания дат?

Выражение date - date возвращает целое число дней (например, 193), а AGE(a, b) — интервал вида «6 mons 12 days», разложенный по календарным годам и месяцам. AGE полезнее для человекочитаемого возраста, вычитание — для точных числовых расчётов в днях.

Как из AGE получить возраст числом лет?

Используйте EXTRACT(YEAR FROM AGE(birth_date)) — это даст целое количество полных лет. Аналогично EXTRACT(MONTH FROM ...) вытащит остаток месяцев. Сам AGE для сравнения (>, <) неудобен, потому что это интервал.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы SQL

Работа с датами

Другие функции SQL

LAG · date_trunc · EXTRACT · strftime · TO_CHAR · CURRENT_DATE

Открыть SQL-тренажёр (565 задач) →