Расчёт возраста по дате рождения в SQL: преобразование и вычисления

Пройдите тест, узнайте какой профессии подходите
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для точного расчета возраста в SQL применяем функцию DATEDIFF, используя ее вместе с оператором CASE. Этот подход позволяет учесть, был ли день рождения в текущем году:

SQL
Скопировать код
SELECT 
  DATEDIFF(YEAR, DOB, GETDATE()) – CASE 
    WHEN (MONTH(DOB) > MONTH(GETDATE())) OR 
         (MONTH(DOB) = MONTH(GETDATE()) AND DAY(DOB) > DAY(GETDATE())) 
    THEN 1 
    ELSE 0 
  END AS Age 
FROM 
  YourTable;

Таким образом, если по сегодняшнюю дату день рождения еще не наступил, метод корректно уменьшает возраст на один год.

Пошаговый план для смены профессии

Подготовка формата DateTime

Перед выполнением расчетов необходимо привести поле DOB к формату datetime. Это обеспечит стандартизацию и точность вычислений:

SQL
Скопировать код
SELECT CONVERT(datetime, DOB, 112) as FormattedDOB
FROM YourTable;

Дата рождения тут преобразуется в формат (ГГГГММДД).

Учёт високосных годов

Кроме того, мы принимаем во внимание високосные годы. Их влияние учитывается путем использования в знаменателе числа 365,25 дней, чтобы учесть дополнительный день каждые четыре года:

SQL
Скопировать код
SELECT FLOOR(DATEDIFF(DAY, DOB, GETDATE()) / 365.25) AS Age
FROM YourTable;

Благодаря этой формуле, дополнительный день в високосных годах не упускается из расчетов.

Особенность: день рождения 29 февраля

Если день рождения приходится на 29 февраля, возраст следует считать, исходя из даты 28 февраля:

SQL
Скопировать код
SELECT 
  CASE 
    WHEN DOB = '2000-02-29' AND MONTH(GETDATE()) > 2 THEN 
      FLOOR(DATEDIFF(DAY, DATEADD(DAY, -1, DOB), GETDATE()) / 365.25)
    ELSE
      FLOOR(DATEDIFF(DAY, DOB, GETDATE()) / 365.25)
  END AS Age
FROM YourTable;

Таким образом, мы корректно учитываем возраст тех, чей день рождения настоящим праздником становится раз в четыре года!

Создание переиспользуемой функции

Можно создать SQL-функцию, которую затем можно будет использовать многократно:

SQL
Скопировать код
CREATE FUNCTION dbo.CalculateAge (@DOB datetime)
RETURNS INT WITH SCHEMABINDING
AS
BEGIN
RETURN DATEDIFF(YEAR, @DOB, GETDATE()) – CASE WHEN (MONTH(@DOB) > MONTH(GETDATE())) OR (MONTH(@DOB) = MONTH(GETDATE()) AND DAY(@DOB) > DAY(GETDATE())) THEN 1 ELSE 0 END;
END;

Теперь возраст можно вычислить с помощью одной функции:

SQL
Скопировать код
SELECT dbo.CalculateAge(DOB) AS Age
FROM YourTable;

Даже старые функции способны на новые трюки!

Визуализация

Визуализируем процесс определения возраста. Вот наглядная схема:

Markdown
Скопировать код
Текущая дата: 🗓️ (На эту дату указывает `getDate()`)
Дата рождения: 🎂

Аналогично тому, как мы добавляем свечи на торт, базы данных считают годы:

SQL
Скопировать код
SELECT FLOOR(DATEDIFF(day, 🎂, 🗓️) / 365.25) AS AgeInYears;

Можно считать это своеобразным вкладом Stack Overflow в праздник:

Markdown
Скопировать код
| Год        | Лет    |
| ---------- | ----------------- |
| Год 🎂     | 1                 |
| Год спустя | 2                 |
| ...        | ...               |
| 🗓️ Год    | 🎈🎈🎈            |

Таким образом, SQL тоже умеет праздновать дни рождения – запросами.

Работа с различными форматами дат

Иногда DOB представлена в нестандартном формате. Можно исправить это, преобразовав дату для расчета возраста:

SQL
Скопировать код
SELECT 
  DATEDIFF(YEAR, CONVERT(datetime, DOB, 112), GETDATE()) -
  CASE 
    WHEN (MONTH(CONVERT(datetime, DOB, 112)) > MONTH(GETDATE())) OR 
         (MONTH(CONVERT(datetime, DOB, 112)) = MONTH(GETDATE()) AND DAY(CONVERT(datetime, DOB, 112)) > DAY(GETDATE())) 
    THEN 1 
    ELSE 0 
  END AS Age 
FROM YourTable;

Это все равно, что приводить торт в порядок с помощью подходящего инструмента!

Тестирование граничных случаев

Проверьте надежность своего решения, используя тестовые примеры, особенно относящиеся к високосным годам или возрасту новорожденных:

SQL
Скопировать код
-- Тестируем функцию на крайние даты рождения
WITH SampleDates AS (
  SELECT CAST('2000-02-29' AS datetime) AS DOB -- Родился в високосный день, редкость.
  UNION ALL SELECT CAST('2001-12-31' AS datetime) -- Малыш, родившийся в канун Нового Года!
  UNION ALL SELECT CAST('1995-01-01' AS datetime) -- Новогодний малыш!
)
SELECT DOB, dbo.CalculateAge(DOB) AS CalculatedAge
FROM SampleDates;

Тестирование – это как шоколадка на торте: с ним все еще лучше!

Простой подход

Иногда достаточно знать количество Полных Лет:

SQL
Скопировать код
SELECT 
  (CAST(CONVERT(varchar, GETDATE(), 112) AS INT) – 
   CAST(CONVERT(varchar, DOB, 112) AS INT)) / 10000 AS Age
FROM YourTable;

Как и в жизни, иногда простота – это основная красота.

Полезные материалы

  1. Как рассчитать возраст (в годах) на основе даты рождения и getDate() – Stack OverflowОбсуждение на Stack Overflow вычисления возраста.
  2. Типы данных и функции даты и времени – SQL Server (Transact-SQL) | Microsoft LearnОфициальная документация Microsoft по функциям работы с датой и временем.
  3. Как рассчитать возраст в T-SQL с учетом лет, месяцев и дней – Stack Overflow — Еще одна тема на Stack Overflow, где обсуждаются сложные расчеты возраста с учетом лет, месяцев и дней.
  4. Создание таблицы размерности дат или календарной таблицы в SQL ServerРуководство на MSSQLTips, объясняющее создание таблицы размерности дат или календарной таблицы в SQL Server.
  5. GETDATE() – Форумы SQL Server Central — Активное обсуждение использования функции GETDATE().
  6. SQL Server: Функция DATEDIFF — Подробное описание функции DATEDIFF в SQL Server, которая имеет ключевое значение для определения возраста.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой SQL-функцией можно точно рассчитать возраст по дате рождения?
1 / 5