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

Как рассчитать возраст в SQL (PostgreSQL, MySQL, SQL Server)

Изучите практические шаблоны SQL для расчета возраста по дате рождения: полные годы, точные годы и месяцы, а также возраст на определенную дату. Включает примеры для PostgreSQL, MySQL и SQL Server.

Как рассчитать возраст в SQL (PostgreSQL, MySQL, SQL Server)

Нужно вычислить возраст в SQL по дате рождения? В этом руководстве показаны практические готовые к копированию запросы для распространенных баз данных. Вы научитесь вычислять:

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

1) Решите, что означает «возраст» для вашего варианта использования

Большая часть бизнес-логики использует проработанные годы. Это означает, что человеку, родившемуся 10 июня 2000 г., 10 июня 2026 г. исполнится 25 лет, не раньше. Будьте осторожны с простым вычитанием года, например ГОД(сегодня) - ГОД(доб), потому что перед днем рождения оно неверно.

2) PostgreSQL: возраст в годах (полных лет)

PostgreSQL имеет встроенную функцию age(), которая возвращает интервал. Извлеките полные годы следующим образом:

ВЫБЕРИТЕ ИЗВЛЕЧЕНИЕ(ГОД ОТ возраста(CURRENT_DATE, дата рождения)) КАК age_years
ОТ людей;

PostgreSQL: возраст на определенную дату

ВЫБЕРИТЕ ИЗВЛЕЧЕНИЕ(ГОД ОТ возраста(ДАТА '2026-02-23', дата рождения)) КАК age_years
ОТ людей;

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(ГОД, доб., CAST(GETDATE() КАК дата))
  - ДЕЛО
      WHEN DATEADD(YEAR, DATEDIFF(YEAR, dob, CAST(GETDATE() AS date)), dob) > CAST(GETDATE() AS date)
      ТОГДА 1 ЕЩЕ 0
    КОНЕЦ КАК age_years
ОТ людей;

SQL Server: возраст на определенную дату

ОБЪЯВИТЬ @as_of date = '2026-02-23';
ВЫБРАТЬ
  DATEDIFF(ГОД, доб., @as_of)
  - ДЕЛО
      КОГДА DATEADD(ГОД, DATEDIFF(ГОД, доб, @as_of), доб) > @as_of
      ТОГДА 1 ЕЩЕ 0
    КОНЕЦ КАК age_years
ОТ людей;

5) Пример точного возраста (лет и месяцев)

Если вам нужна «точная» презентация, например «31 год 4 месяца», сначала вычислите годы, а затем месяцы после последнего дня рождения. Вот один пример PostgreSQL:

С базовым AS (
  ВЫБЕРИТЕ день рождения, CURRENT_DATE AS as_of
  ОТ людей
)
ВЫБРАТЬ
  EXTRACT(YEAR FROM age(as_of, dob)) КАК лет,
  EXTRACT(МЕСЯЦ ИЗ возраста(as_of, дата рождения)) КАК месяцев
ИЗ базы;

Распространенные ошибки

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

Быстрая проверка работоспособности

Если вы хотите быстро подтвердить один день рождения, вы можете использовать онлайн-калькулятор: Рассчитать возраст онлайн.

Связанные руководства

Часто задаваемые вопросы

Почему ГОД(сегодня) минус ГОД(доб) неправильный?

Он игнорирует, наступил ли уже день рождения в этом году, поэтому завышает возраст до дня рождения.

Какой тип SQL наиболее безопасен для даты рождения?

Используйте столбец дата (не дата и время) для даты рождения, если вас интересует только календарный день.