文档章节

自定义oracle版函数来计算年龄(规则一)

streamlong
 streamlong
发布于 2015/12/23 15:41
字数 588
阅读 56
收藏 0
CREATE OR REPLACE FUNCTION uf_get_age(ad_csrq IN date, ad_dqrq IN date)
  RETURN VARCHAR2 IS
  RESULT   VARCHAR2(50);
  n_months number;
  n_days   number;
  t_days   number(18,1);
  d_dqrq   date;
  s_nl     VARCHAR2(50);
  s_ts     VARCHAR2(50);
BEGIN
  Begin
    IF ad_csrq is null OR ad_csrq <= TO_DATE('1900-1-1', 'YYYY-MM-DD') OR
       ad_csrq > ad_dqrq THEN
      RESULT := '';
      RETURN(RESULT);
    END IF;
    IF ad_dqrq is null OR ad_dqrq <= TO_DATE('1900-1-1', 'YYYY-MM-DD') THEN
      d_dqrq := SYSDATE;
    ELSE
      d_dqrq := ad_dqrq;
    END IF;
    -- 以实(周)岁 算*/
    select to_number(to_char(d_dqrq, 'YYYY')) * 12 +
           to_number(to_char(d_dqrq, 'MM')) -
           (to_number(to_char(ad_csrq, 'YYYY')) * 12 +
            to_number(to_char(ad_csrq, 'MM')))
      into n_months
      from dual; ---// (当前年份*12+当前月份) – (出生年份*12+出生月份)
    IF n_months > 72 THEN
      --//如果大于72个月,6岁
      ---  //周岁的算法
      If to_char(ad_csrq, 'MM') = to_char(d_dqrq, 'MM') Then
        --  //同月的时候
        If to_char(ad_csrq, 'DD') > to_char(d_dqrq, 'DD') then
          s_nl := to_char(Trunc(n_months / 12, 0) - 1) || '岁';
        else
          s_nl := Trunc(n_months / 12, 0) || '岁';
        End If;
      Else
        s_nl := Trunc(n_months / 12, 0) || '岁';
      End If;
    ELSIF n_months > 12 and n_months < 72 then
      If to_char(ad_csrq, 'MM') = to_char(d_dqrq, 'MM') Then
        --  //同月的时候
        If to_char(ad_csrq, 'DD') > to_char(d_dqrq, 'DD') then
            s_nl := to_char(Trunc(n_months / 12, 0) - 1) || '岁' ||
                    to_char(mod(n_months - 1, 12)) || '月';
        else
            s_nl := Trunc(n_months / 12, 0) || '岁';
        End If;
      Else
        If to_char(ad_csrq, 'DD') > to_char(d_dqrq, 'DD') then
          if mod(n_months - 1, 12) = 0 then
            s_nl := Trunc(n_months / 12, 0) || '岁';
          else
            s_nl := Trunc(n_months / 12, 0) || '岁' ||
                    to_char(mod(n_months - 1, 12)) || '月';
          end if;
        else
          if mod(n_months, 12) = 0 then
            s_nl := Trunc(n_months / 12, 0) || '岁';
          else
            s_nl := Trunc(n_months / 12, 0) || '岁' ||
                    to_char(mod(n_months, 12)) || '月';
          end if;
        end if;
      End If;
    ELSIF n_months >= 1 and n_months < 12 THEN
      --//如果大于等于1个月小于12个月
      n_days := floor(ad_dqrq - ad_csrq); ---//增加天数判断
      IF n_days < 31 THEN
        ---// 如果天数小于31天,单位取“天“
        s_nl := to_char(n_days) || '天';
      ELSE
        if to_char(ad_csrq, 'DD') > to_char(d_dqrq, 'DD') then
          s_ts := floor(to_char(last_day(ad_csrq), 'DD') -
                        to_char(ad_csrq, 'DD') + to_char(d_dqrq, 'DD'));
          if n_months = 1 then
            s_nl := s_ts || '天';
          else
            s_nl := to_char(n_months - 1) || '月' || s_ts || '天';
          end if;
        else
          s_ts := floor(to_char(d_dqrq, 'DD') - to_char(ad_csrq, 'DD'));
          if s_ts = 0 then
            s_nl := to_char(n_months) || '月';
          else
            s_nl := to_char(n_months) || '月' || s_ts || '天';
          end if;
        end if;
      END IF;
    ELSIF n_months = 12 THEN
      if to_char(ad_csrq, 'DD') > to_char(d_dqrq, 'DD') then
        s_ts := floor(to_char(last_day(ad_csrq), 'DD') -
                      to_char(ad_csrq, 'DD') + to_char(d_dqrq, 'DD'));
        s_nl := '11月' || s_ts || '天';
      else
        s_nl := '1岁';
      end if;
    ELSIF n_months = 72 THEN
      if to_char(ad_csrq, 'DD') > to_char(d_dqrq, 'DD') then
        s_nl := '5岁11月';
      else
        s_nl := '6岁';
      end if;
    ELSE
      ---//单位取“天”
      t_days := trunc(ad_dqrq - ad_csrq, 1);
      n_days := floor(ad_dqrq - ad_csrq);
      if t_days < 1 then---//如果不满一天,显示“小时”
        s_nl := round(to_number(ad_dqrq - ad_csrq) * 24) ||'小时';
      else
        s_nl := to_char(n_days) || '天';---//满一天不满一月,显示“天”
      end if;
    END IF;
    IF s_nl is null THEN
      s_nl := '';
    END IF;
    RESULT := s_nl;
  EXCEPTION
    WHEN OTHERS THEN
      RESULT := '';
  End;

  RETURN(RESULT);
END uf_get_age;
/

© 著作权归作者所有

共有 人打赏支持
streamlong

streamlong

粉丝 21
博文 45
码字总数 16725
作品 0
杭州
细说 Angular 的自定义表单控件

我们在构建企业级应用时,通常会遇到各种各样的定制化功能,因为每个企业都有自己独特的流程、思维方式和行为习惯。有很多时候,软件企业是不太理解这种情况,习惯性的会给出一个诊断,『你这...

接灰的电子产品
2017/07/21
0
0
警惕!自定义函数索引的那些陷阱及避坑术

作者介绍 丁俊,DBAplus社群联合发起人,新炬网络专家团成员,性能优化专家,Oracle ACEA,ITPUB开发版资深版主。十年电信行业从业经验,从事过系统开发与维护、业务架构和数据分析、系统优化...

丁俊
2016/10/09
0
0
为什么要使用函数式编程?

最近看了gitbook上面一本函数式编程的书。突然间对函数式编程有了更加深入的理解。而且前一阵子使用HRFrame第二版开发公司的项目的时候遇到一些本质性的问题。其实早就想开发第三版本了。但是...

架构梦想
2016/06/21
57
0
采用一个自创的"验证框架"实现对数据实体的验证[编程篇]

昨天晚上突发奇想,弄了一个简易版的验证框架,用于进行数据实体的验证。目前仅仅实现基于属性的声明式的验证,即通过自定义特性(Custom Attribute)的方式将相应的Validator应用到对应的属...

长平狐
2012/09/04
55
0
ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)

ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需要将相应的ValidationAttribute应用到Model的类型或者属...

长平狐
2012/09/04
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

vue项目移动端300毫秒延时解决方案 fastclick插件

ios系统因为3dtouch的原因,在button的点击事件上会有300毫秒延时,可以使用fastclick解决 https://github.com/ftlabs/fastclick终端执行命令:npm install fastclick --save 打开m...

阿K1225
26分钟前
2
0
浅谈高性能数据库集群 —— 分库分表  

浅谈高性能数据库集群 —— 分库分表 高性能数据库集群分库分表相关理论,基本架构,涉及的复杂度问题以及常见解决方案。 分库分表概述 读写分离分散数据库读写操作压力,分库分表分散存储压...

DemonsI
27分钟前
1
0
APPKIT打造稳定、灵活、高效的运营配置平台

一、背景 美团App、大众点评App都是重运营的应用。对于App里运营资源、基础配置,需要根据城市、版本、平台、渠道等不同的维度进行运营管理。如何在版本快速迭代过程中,保持运营资源能够被高...

美团技术团队
30分钟前
1
0
commons-pool对象池相关分析

源代码下载 官网 Git 下载: $ git clone https://git-wip-us.apache.org/repos/asf/commons-pool.git 源码包下载src.zip 核心的类及关系如下图: ObjectPool ObjectPool是对象池的接口,定...

宸明
32分钟前
1
0
phpMyAdmin checkPageValidity 函数缺陷可导致 GETSHELL

阿里云盾提示phpMyAdmin <=4.8.1会出现漏洞有被SHELL风险,具体漏洞提醒: 标题 phpMyAdmin <=4.8.1 后台checkPageValidity函数缺陷可导致GETSHELL 简介 checkPageValidity函数对外部输入过滤...

slagga
34分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部