Как точно рассчитать возраст человека на экране выступления
Informix-SE 4.10 с isql 4.10 DD6:
У меня есть столбец DATE, BirthDate, связанный с тегом поля выполнения "dob". Когда пользователи вводят dob, я делаю следующую арифметику дат:
age = (TODAY - dob ) / 365.25
возраст тега поля - это поле DECIMAL типа DISPLAYONLY, с FORMAT="##.##".
Этот метод не дает точных результатов.
Бизнес-правило: Пример. Если человеку, которому не исполнилось 18 лет, не исполнилось 18 лет, мне нужно отобразить 17 лет в теге поля возраста и прервать вставку строки клиента. Человеку должно быть>=18 лет.
В этой версии ifx поддерживаются типы данных DATETIME и INTERVAL, но пользователям удобно вводить даты только в формате MMDDYYYY.
1 ответ
Чтобы определить, произошел ли день рождения в этом году, вы должны быть уверены, что не создали недействительную дату в случае, если dob
29 февраля и TODAY
в не високосный год. Поскольку 2000 год является високосным, вы можете избежать проблем, связанных с вычитанием всегда на 2000 год.
MDY(MONTH(dob), DAY(dob), 2000) > MDY(MONTH(TODAY), DAY(TODAY), 2000)
Наконец, вычтите одно из разницы в году, если это так:
age = (YEAR(TODAY) - YEAR(dob) -
CASE WHEN MDY(MONTH(dob), DAY(dob), 2000) > MDY(MONTH(TODAY), DAY(TODAY), 2000)
THEN 1 ELSE 0 END)::int