根据出生日期与指定的计算时间(当前时间或者其他时间)计算准确的年龄,年月日分别以竖线分隔
CREATE OR REPLACE Function Zljk_Age_Calc
(
出生日期_In Date := Null,
计算日期_In Date := Null
) Return Varchar2
As
d_出生日期 Date;
d_计算日期 Date;
n_Days Number;
n_Months Number;
n_Upperagelimit Number; --参数:年龄上限
v_Return Varchar2(20); --由于病人信息等相关表的年龄字段为10个字符,所以最大允许10个字符或5个汉字
Begin
--当天登记的病人不用重算年龄
d_出生日期:=出生日期_In;
d_计算日期:=计算日期_In;
--获取儿童年龄的上限,请根据平台要求自行修改,三医上报要求的儿童年龄为6岁
n_Upperagelimit:=6;
n_Months := Trunc(Months_Between(d_计算日期, d_出生日期));
If n_Months < 12 * n_Upperagelimit Then
--小于1岁的情况
If n_Months < 12 Then
--小于1月
If n_Months < 1 Then
n_Days := Trunc(d_计算日期 - d_出生日期);
--一天以内
If n_Days = 0 Then
n_Days := Trunc((d_计算日期 - d_出生日期) * 24 * 60);
If Mod(n_Days, 60) = 0 Then
-- v_Return := n_Days / 60 || '小时';
v_Return := '||'||to_char(round(n_Days / 60/24,2),'fm999999990.9999999')
;
Else
-- v_Return := Floor(n_Days / 60) || '小时' || Mod(n_Days, 60) || '分钟';
v_Return := '||'||to_char(round((Floor(n_Days / 60)/24+ Mod(n_Days, 60)/60/24),2),'fm999999990.9999999') ;
End If;
Else
--一天至一月 精确到小时 :X天X小时
n_Days := Trunc((d_计算日期 - d_出生日期) * 24);
If Mod(n_Days, 24) = 0 Then
-- v_Return := n_Days / 24 || '天';
v_Return := '||'||to_char(round(n_Days / 24,2),'fm999999990.9999999') ;
Else
v_Return := '||'||to_char(round((Floor(n_Days / 24) + Mod(n_Days, 24)/24),2),'fm999999990.9999999') ;
End If;
End If;
Else
--大于1月
n_Days := Trunc(Add_Months(d_计算日期, -1 * n_Months) - d_出生日期);
If n_Days >= 31 Then
--针对计算日期是2月份最后一天,出生日期刚好大于2月份最后一天且当天不是本月的最后一天
--如:计算日期:2016-02-29 出生日期:2015-01-30
n_Months := n_Months + 1;
n_Days := n_Days - 31;
End If;
If n_Days = 0 Then
---v_Return := n_Months || '月';
v_Return := '|'||n_Months ||'|';
Else
v_Return := '|'||n_Months ||'|'|| n_Days ;
End If;
End If;
Else
--1岁到小于婴儿年龄上限的情况
If Mod(n_Months, 12) = 0 Then
--v_Return := n_Months / 12 || '岁';
v_Return := n_Months / 12 || '||';
Else
--v_Return := Floor(n_Months / 12) || '岁' || Mod(n_Months, 12) || '月';
v_Return := Floor(n_Months / 12) || '|' || Mod(n_Months, 12) || '|';
End If;
End If;
Else
--大于等于婴儿年龄上限(直接X岁)
-- v_Return := Floor(n_Months / 12) || '岁';
v_Return := Floor(n_Months / 12) || '||';
End If;
Return v_Return;
Exception
When Others Then
zl_ErrorCenter(SQLCode, SQLErrM);
End Zljk_Age_Calc;