文档章节

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

streamlong
 streamlong
发布于 2015/12/23 15:41
字数 588
阅读 52
收藏 0
点赞 0
评论 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

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

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

接灰的电子产品 ⋅ 2017/07/21 ⋅ 0

为什么要使用函数式编程?

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

架构梦想 ⋅ 2016/06/21 ⋅ 0

采用一个自创的"验证框架"实现对数据实体的验证[编程篇]

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

长平狐 ⋅ 2012/09/04 ⋅ 0

ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)

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

长平狐 ⋅ 2012/09/04 ⋅ 0

ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象,在不同的使用场景中可能具有不同的验证规则。举个简单的例子,对于一个表示应聘者的数...

长平狐 ⋅ 2012/09/04 ⋅ 0

Mysql /Oralce 50个区别

   1. 有些人说Oracle没有限制,实际上他们说得可能是Oracle不支持LIMIT语法.不过可以rownum虚列来实现,不过会更加麻烦.   2. Oracle不支持偏移(offset)语法. 3. Oracle的复制功能可能比M...

pczhangtl ⋅ 2014/08/03 ⋅ 0

kNN最邻近规则分类

原理介绍: 这一个月来恶补了一下大学的数学知识,把高数、线代、概率论、复变函数和积分变换又温习了一遍,大学里学的差一点就忘光了。大学时每次上数学课可都是昏昏欲睡啊!哈哈!学习人工...

晨曦之光 ⋅ 2012/06/07 ⋅ 0

玩转大数据系列之Apache Pig如何通过自定义UDF查询数据库(五)

GMV(一定时间内的成交总额)是一个衡量电商网站营业收入的一项重要指标,例如淘宝,京东都有这样的衡量标准,感兴趣的朋友可以自己科普下这方面的概念知识。 当然散仙今天,并不是来解释概念的...

九劫散仙 ⋅ 2015/03/12 ⋅ 0

scala里集合排序函数的使用

排序方法在实际的应用场景中非常常见,Scala里面有三种排序方法,分别是: sorted,sortBy ,sortWith 分别介绍下他们的功能: (1)sorted 对一个集合进行自然排序,通过传递隐式的Orderin...

张欢19933 ⋅ 04/27 ⋅ 0

QuickBI助你成为分析师——计算字段功能

在用户创建报表时,通过现有字段数据不能直接满足展示需求,需要进行一定建模操作。目前产品支持在数据集编辑界面进行初步建模,下面主要介绍新建字段功能,以达到展示需求。 什么是计算字段...

yuan0924 ⋅ 05/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何解决s权限位引发postfix及crontab异常

一、问题现象 业务反馈某台应用服务器,普通用户使用mutt程序发送邮件时,提示“postdrop warning: mail_queue_enter: create file maildrop/713410.6065: Permission denied”,而且普通用法...

问题终结者 ⋅ 19分钟前 ⋅ 0

Unable to load database on disk

由于磁盘空间满了以后,导致zookeeper异常退出,清理磁盘空间后,zk启动报错,信息如下: 2018-06-25 17:18:46,904 INFO org.apache.zookeeper.server.quorum.QuorumPeerConfig: Reading co...

刀锋 ⋅ 38分钟前 ⋅ 0

css3 box-sizing:border-box 实现div一行多列

<!DOCTYPE html><html><head><style> div.container{ background:green; padding:10px 10px;}div.box{box-sizing:border-box;-moz-box-sizing:border-box; /* Fir......

qimh ⋅ 44分钟前 ⋅ 0

Homebrew简介和基本使用

一、Homebrew是什么 Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径...

说回答 ⋅ 51分钟前 ⋅ 0

文件压缩和打包zip、tar

第六章 文件压缩和打包 6.5 zip压缩工具 zip命令可以用来解压缩文件,或者对文件进行打包操作。zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有“.zip”扩展名的压缩文件。 注意:...

弓正 ⋅ 52分钟前 ⋅ 0

vuex

一、状态对象如何赋值给内部对象。三种方式: 1、使用computed赋值,一定要写this,不然找不到$store。 computed:{ count(){ return this.$store.state.count; }} 2、通...

大美琴 ⋅ 今天 ⋅ 0

javaScript 设计模式

1、构造函数模式 ` /** 构造一个动物的函数 */ function Animal(name, color){ this.name = name; this.color = color; this.getName = function(){ return this.name; } } // 实例一个对象 ......

fangPeng_ ⋅ 今天 ⋅ 0

日常嘚瑟:TeamCity构建中解压和打包tar

要弄一个新的构建,很简单,从两个构建的tar格式Artifact中分别取一部分,重新打一个tar。 所以,我去写个脚本用curl下载两个依赖的Artifact,然后解压移动重新打个tar? 开什么玩笑,我的技...

谷永权 ⋅ 今天 ⋅ 0

Istio官方文档中文版

阅读目录 Istio官方文档中文版 回到目录 Istio官方文档中文版 http://istio.doczh.cn/ https://istio.io/docs/concepts/what-is-istio/goals.html 为什么要使用Istio? 在从单体应用程序向分...

xiaomin0322 ⋅ 今天 ⋅ 0

CentOS 7 Omnibus 包安装 GitLab 并汉化记录

系统环境 操作系统:CentOS 7GitLab:gitlab-ce-10.8.4-ce.0.el7.x86_64.rpm 下载Omnibus安装包 使用国内镜像加速下载地址 # wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el......

admin_qing ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部