Как рассчитать возраст в 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 марта в зависимости от политики.
- Нулевой или будущий день рождения: фильтровать или охранять, в противном случаеваш запрос вернет пустые или отрицательные значения.
Быстрая проверка работоспособности
Если вы хотите быстро подтвердить один день рождения, вы можете использовать онлайн-калькулятор: Рассчитать возраст онлайн.
Связанные руководства
- Как рассчитать возраст (полное руководство)
- Как рассчитать возраст в Excel
- Как рассчитать возраст в JavaScript
Часто задаваемые вопросы
Почему ГОД(сегодня) минус ГОД(доб) неправильный?
Он игнорирует, наступил ли уже день рождения в этом году, поэтому завышает возраст до дня рождения.
Какой тип SQL наиболее безопасен для даты рождения?
Используйте столбец дата (не дата и время) для даты рождения, если вас интересует только календарный день.