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
SELECT id,
EXTRACT(YEAR FROM AGE(birth_date)) AS years
FROM users
LIMIT 2;
Результат:
id | years ---+------ 1 | 34 2 | 28
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-задачи в тренажёре →
Спрашивают, когда нужно посчитать возраст или стаж; в паре с EXTRACT / DATE_PART (вытащить годы числом) и с типом INTERVAL.
Нет, это функция только PostgreSQL. В MySQL аналог — TIMESTAMPDIFF(YEAR, birth_date, NOW()) для числа лет. В SQLite считают через strftime или (julianday(a) - julianday(b)) для дней. Прямого эквивалента символьного интервала «годы-месяцы-дни» в них нет.
Выражение date - date возвращает целое число дней (например, 193), а AGE(a, b) — интервал вида «6 mons 12 days», разложенный по календарным годам и месяцам. AGE полезнее для человекочитаемого возраста, вычитание — для точных числовых расчётов в днях.
Используйте EXTRACT(YEAR FROM AGE(birth_date)) — это даст целое количество полных лет. Аналогично EXTRACT(MONTH FROM ...) вытащит остаток месяцев. Сам AGE для сравнения (>, <) неудобен, потому что это интервал.
LAG · date_trunc · EXTRACT · strftime · TO_CHAR · CURRENT_DATE
Открыть SQL-тренажёр (565 задач) →