Назад до Блогу
3 min read

Як обчислити вік у SQL (PostgreSQL, MySQL, SQL Server)

Вивчіть практичні шаблони SQL для обчислення віку від дати народження: повні роки, точні роки та місяці та вік на певну дату. Містить приклади для PostgreSQL, MySQL і SQL Server.

Як обчислити вік у SQL (PostgreSQL, MySQL, SQL Server)

Потрібно обчислити вік у SQL за датою народження? У цьому посібнику показано практичні, готові для копіювання запити для поширених баз даних. Ви навчитеся обчислювати:

  • Вік у роках (повні роки)
  • Вік на певну дату (не тільки сьогодні)
  • Точний вихідний стиль (роки та місяці), коли вам потрібно більше деталей

1) Вирішіть, що означає "вік" для вашого випадку використання

Більшість бізнес-логіки використовує років. Це означає, що людині, яка народилася 10 червня 2000 року, виповнюється 25 років 10 червня 2026 року, а не раніше. Будьте обережні з простим відніманням року, як-от YEAR(сьогодні) - YEAR(dob), оскільки воно неправильне перед днем народження.

2) PostgreSQL: вік у роках (завершені роки)

PostgreSQL має вбудовану функцію age(), яка повертає інтервал. Витягніть повні роки так:

ВИБРАТИ ЕКСТРАКТ(РІК З віку(CURRENT_DATE, нар.)) ЯК вік_років
ВІД людей;

PostgreSQL: вік на певну дату

ВИБРАТИ ЕКСТРАКТ(РІК З вік(ДАТА '2026-02-23', народження)) ЯК вік_роки
ВІД людей;

3) MySQL: вік у роках (завершені роки)

У MySQL використовуйте TIMESTAMPDIFF:

SELECT TIMESTAMPDIFF(YEAR, dob, CURDATE()) AS age_years
ВІД людей;

MySQL: вік на певну дату

SELECT TIMESTAMPDIFF(YEAR, dob, DATE('2026-02-23')) AS age_years
ВІД людей;

4) SQL Server: вік у роках (завершені роки)

Поширеним шаблоном у SQL Server є DATEDIFF мінус чек на день народження:

ВИБРАТИ
  DATEDIFF(YEAR, dob, CAST(GETDATE() AS date))
  - СПРАВА
      WHEN DATEADD(YEAR, DATEDIFF(YEAR, dob, CAST(GETDATE() AS date)), dob) > CAST(GETDATE() AS date)
      ПОТІМ 1 ІНШЕ 0
    END AS age_years
ВІД людей;

SQL Server: вік на певну дату

ОГОЛОШИТИ @as_of date = '2026-02-23';
ВИБРАТИ
  DATEDIFF(YEAR, dob, @as_of)
  - СПРАВА
      WHEN DATEADD(YEAR, DATEDIFF(YEAR, dob, @as_of), dob) > @as_of
      ПОТІМ 1 ІНШЕ 0
    END AS age_years
ВІД людей;

5) Приклад точного віку (роки та місяці)

Якщо вам потрібна «точна» презентація, наприклад «31 рік 4 місяці», обчисліть спочатку роки, а потім місяці після останнього дня народження. Ось один із прикладів PostgreSQL:

З базовою AS (
  ВИБРАТИ дов., CURRENT_DATE AS_of
  ВІД людей
)
ВИБРАТИ
  EXTRACT(YEAR FROM age(as_of, dob)) AS років,
  EXTRACT(MONTH FROM age(as_of, dob)) AS months
З бази;

Поширені підводні камені

  • Часові пояси: за можливості зберігайте DOB як дату. Дати й час можуть змінюватися в різних зонах.
  • Дні народження у високосні дні: визначте, що відбувається у невисокосні роки. Більшість систем розглядають дні народження 2004-02-29 як 02-28 або 03-01 залежно від політики.
  • Нульовий або майбутній DOB: фільтр або захист, інакшеваш запит поверне нульові або від’ємні значення.

Швидка перевірка працездатності

Якщо ви хочете швидко підтвердити єдиний DOB, ви можете скористатися онлайн-калькулятором: Обчислити вік онлайн.

Схожі посібники

Поширені запитання

Чому YEAR(сьогодні) мінус YEAR(dob) неправильно?

Він ігнорує, чи був день народження цього року, тому він завищує вік до дня народження.

Який найбезпечніший тип SQL для дати народження?

Використовуйте стовпець date (а не datetime) для DOB, якщо вам важливий лише календарний день.