如何在表演屏幕中准确计算人的年龄
How to accurately calculate person's age in a perform screen
带有 isql 4.10 DD6 的 Informix-SE 4.10:
我有一个 DATE 列,BirthDate,链接到一个执行字段标签 "dob"。当用户输入 dob 时,我正在执行以下日期算法:
age = (TODAY - dob ) / 365.25
字段标记年龄是 DISPLAYONLY TYPE DECIMAL 字段,FORMAT="##.##"。
此方法生成的结果不准确。
业务规则:例如,如果一个人在18岁生日的前一天真实年龄不是18岁,我需要在年龄字段标记中显示17,并中止客户行的插入。人必须年满 18 岁。
此 ifx 版本支持 DATETIME 和 INTERVAL 数据类型,但用户只习惯以 MMDDYYYY 格式输入日期。
为了判断生日是不是今年,在dob
是February 29[=23=的情况下一定要确保不要生成无效日期] 而 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
带有 isql 4.10 DD6 的 Informix-SE 4.10:
我有一个 DATE 列,BirthDate,链接到一个执行字段标签 "dob"。当用户输入 dob 时,我正在执行以下日期算法:
age = (TODAY - dob ) / 365.25
字段标记年龄是 DISPLAYONLY TYPE DECIMAL 字段,FORMAT="##.##"。
此方法生成的结果不准确。
业务规则:例如,如果一个人在18岁生日的前一天真实年龄不是18岁,我需要在年龄字段标记中显示17,并中止客户行的插入。人必须年满 18 岁。
此 ifx 版本支持 DATETIME 和 INTERVAL 数据类型,但用户只习惯以 MMDDYYYY 格式输入日期。
为了判断生日是不是今年,在dob
是February 29[=23=的情况下一定要确保不要生成无效日期] 而 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