oracle年龄计算函数

根据出生日期与指定的计算时间(当前时间或者其他时间)计算准确的年龄,年月日分别以竖线分隔

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;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂狼的小蝴蝶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值