Published on

May 9, 2018

Понимание расчета возраста в SQL Server

Добро пожаловать в нашу статью о расчете возраста в SQL Server. В этой статье мы обсудим алгоритм правильного расчета возраста и представим скрипт T-SQL, который реализует этот алгоритм.

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

Чтобы сделать скрипт функциональным, нам нужно добавить еще две функции. Во-первых, возможность обработки “обратного” возраста, когда дата “Сегодня” раньше даты “Дата рождения” (например, для исторических ссылок до нашей эры). Во-вторых, возможность принимать параметр, указывающий, какие части даты нужно учитывать.

Чтобы обработать обратный возраст, мы изменяем самую внутреннюю производную таблицу в скрипте. Теперь [Дата от] всегда будет меньше или равна [Дата до], а столбец [Направление] указывает на случай “обратного возраста”.

Для второго требования мы можем реализовать его несколькими способами. Один из вариантов – использовать набор параметров, определяющих, какие части даты нужно учитывать. Другой вариант – использовать двоичную строку с побитовыми операциями, где каждый бит представляет часть даты. В этой статье мы будем использовать литеральную строку, состоящую из однобуквенных кодов, представляющих части даты (например, Y для лет, M для месяцев, D для дней и т. д.).

Давайте начнем с расчета количества полных лет:


-- Пример кода здесь

Это даст нам тот же результат, что и в первой части статьи. У нас есть 4 полных года, и новая “Дата от” представляет собой дату, когда возраст 4 года достигается.

Теперь давайте удалим код “Y” из параметра @Units:


-- Пример кода здесь

Как и ожидалось, мы получаем 0 лет, и дата от остается такой же, как @BirthDate.

Затем давайте рассчитаем месяцы:


-- Пример кода здесь

Расчеты для необходимых записей “Tally” становятся немного сложнее. Если мы не учитывали годы на предыдущем этапе, нам нужно общее количество месяцев между Датой от и Датой до. В противном случае нам нужно только 12 записей “Tally”.

Теперь давайте добавим еще один уровень и рассчитаем дни:


-- Пример кода здесь

Для того же набора параметров мы получаем ожидаемый результат.

Последний кусок нашей проблемы – разбор временной части на отдельные части времени в зависимости от наличия соответствующих кодов частей в параметре @Units. Эта часть проста и не требует “цикла Tally”.

Наконец, нам нужно умножить все рассчитанные части возраста на [Направление], чтобы учесть направление расчета возраста.

Со всеми частями на месте наша функция готова. Вы можете найти полный скрипт, приложенный к этой статье, который также включает пример тестового скрипта для проверки различных сценариев.

Вывод

В этой статье мы представили метод расчета возраста в SQL Server, который избегает “пропуска дней” в последовательности роста возраста. Этот метод позволяет представлять возраст в переменных наборах единиц даты-времени. Мы также реализовали этот метод в виде встроенной таблицы функций T-SQL.

Помимо его прямого применения, этот метод также может использоваться для других целей. Например, расчет возраста в “Годы-Дни” позволяет преобразовывать календарные даты в юлианские даты (YYYYDDD) и наоборот.

Мы надеемся, что вы найдете эту статью информативной и полезной. Удачи в исследовании новых горизонтов в SQL Server!

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.