文档章节

自定义年龄函数 ★Oracle版本★(规则二)

streamlong
 streamlong
发布于 2015/12/31 15:33
字数 804
阅读 32
收藏 5
1.DateAdd
CREATE OR REPLACE Function DateAdd
(
    Datepart  In Varchar2,
    c In number,
    curDate   In Date
) Return Date Is
    ReallyDo Date;
Begin
    Select Case Upper(Datepart)
               When 'D' Then
                curDate+c
               Else
                sysdate
           End
    Into ReallyDo
    From Dual;
    Return(ReallyDo);
End DateAdd;
-------------------------------------
2.DateDiff
CREATE OR REPLACE Function Datediff
(
    Datepart  In Varchar2,
    StartDate In Date,
    EndDate   In Date
) Return Number Is
    ReallyDo Numeric;
Begin
    Select Case Upper(Datepart)
               When 'YYYY' Then
                Trunc(Extract(Year From EndDate) -
                      Extract(Year From StartDate))
               When 'M' Then
                Datediff('YYYY', StartDate, EndDate) * 12 +
                (Extract(Month From EndDate) -
                 Extract(Month From StartDate))
               When 'D' Then
                Trunc(EndDate - StartDate)
               When 'H' Then
                Datediff('D', StartDate, EndDate) * 24 +
                (to_Number(to_char(EndDate, 'HH24')) -
                 to_Number(to_char(StartDate, 'HH24')))
               When 'N' Then
                Datediff('D', StartDate, EndDate) * 24 * 60 +
                (to_Number(to_char(EndDate, 'MI')) -
                 to_Number(to_char(StartDate, 'MI')))
               When 'S' Then
                Datediff('D', StartDate, EndDate) * 24 * 60 * 60 +
                (to_Number(to_char(EndDate, 'SS')) -
                 to_Number(to_char(StartDate, 'SS')))
               Else
                -29252888
           End
    Into ReallyDo
    From Dual;
    Return(ReallyDo);
End Datediff;
------------------------------
3.DateDepart
CREATE OR REPLACE Function Datepart
(
    Datepart  In Varchar2,
    curDate   In Date
) Return number Is
    ReallyDo numeric;
Begin
    Select Case Upper(Datepart)
               When 'Y' Then
                to_number(to_char(curDate, 'YYYY'), '999999')
               When 'MM' Then
                to_number(to_char(curDate, 'MM'), '999999')
               When 'D' Then
                to_number(to_char(curDate, 'DD'), '999999')
               When 'H' Then
                to_number(to_char(curDate, 'HH24'), '999999')
               When 'MI' Then
                to_number(to_char(curDate, 'MI'), '999999')
               Else
                -29252888
           End
    Into ReallyDo
    From Dual;
    Return(ReallyDo);
End Datepart;
------------------------------------
4.自定义函数实现uf_getAge
create or replace function uf_GetAge(birthDate in date)
RETURN VARCHAR2 IS
  RESULT   VARCHAR2(50);
 curNow date;
 y number;
 m number;
 d number;
 h number;
 mi number;
 IsRunNian number := 0;
 lastMonthDayCount number;
 nowmonth number;
 nowday number;
 showMonth number := 3;  --显示月的最大年龄 <3
 showDay number := 1;  --显示天的最大月 <1
 showHour number := 3;  --显示小时的最大天 <3
 showMin number := 3;  --显示分钟的最大小时 <3
 allHours number;--总小时数
 allMins number;--总分钟数
 newBirthDate date;
begin
  select sysdate into curNow from dual;

  if to_char(birthDate, 'HH24:MI:SS') > to_char(curNow, 'HH24:MI:SS') then
		 select dateadd('D',1,birthDate) into newBirthDate from dual;
	else
     newBirthDate := birthDate;
  end if;

  select to_char(curNow, 'YYYY') - to_char(newBirthDate, 'YYYY') into y from dual;
  select to_char(curNow, 'MM') - to_char(add_months(newBirthDate, y*12), 'MM') into m from dual;
  select to_char(curNow, 'DD') - to_char(add_months(newBirthDate, y*12+m), 'DD') into d from dual;

--  return d
--  select y,m, d
  if ((mod(datepart('Y', curNow), 4) =0 and mod(datepart('Y', curNow),100)<>0) or ( mod(datepart('Y', curNow),400)=0)) then
    IsRunNian:=1;
  end if;

  select datepart('MM', curNow) into nowmonth  from dual;
  select datepart('D', curNow) into nowday from dual;
  nowmonth := nowmonth - 1;
  if nowmonth in(1,3,5,7,8,10,12) then--进入xx月xx天判断
       lastMonthDayCount := 31;
  elsif nowmonth in(4,6,9,11) then
       lastMonthDayCount := 30;
  elsif nowmonth=2 then
      if IsRunNian=0 then
       lastMonthDayCount:=28;
      elsif IsRunNian=1  then
       lastMonthDayCount:=29;
      end if;
 end if;

--  select lastMonthDayCount

  if (d < 0) then
     d := lastMonthDayCount + d;
     m := m -1;
  end if;

  if (m < 0) then
     m := 12 + m;
     y := y -1;
  end if;

  if(y >=0 and m >= 0 and d >= 0) then
    
    if y > 0 then
       result := to_char(y) || '岁';
    end if;
    
    if (y >= showMonth) then
        RETURN(result);
    end if;

    if m > 0 then
       result := result || to_char(m) || '月';
    end if;
    if (m >=showDay) then
        RETURN(result);
    end if;
    
    if d > 0 then
        result := result || to_char(d) || '天';
    end if;
    if (d >=showHour)  then
        RETURN(result);
    end if;
    
    SELECT  trunc(to_number(sysdate - (TO_DATE(to_char(curNow, 'YYYY-MM-DD ') ||to_char(newBirthDate, 'HH24:MI:SS'), 'YYYY-MM-DD HH24:mi:ss')-1))*24) into allHours from dual; 
    select mod(allHours, 24) into h from dual;
    if h > 0 then
       result := result || h||'小时';
    end if;
    if (h >=showMin)   then
        RETURN(result);
    end if;
    
    SELECT  trunc(to_number(sysdate - (TO_DATE(to_char(curNow, 'YYYY-MM-DD ') ||to_char(newBirthDate, 'HH24:MI:SS'), 'YYYY-MM-DD HH24:mi:ss')-1))*24*60) into allMins from dual;   
    select mod(allMins, 60) into mi from dual;
    if mi > 0 then
       result := result || mi||'分';
    else 
       result := result;
    end if;
    RETURN(result);
  end if;
  return '0';
end uf_getage;


© 著作权归作者所有

共有 人打赏支持
streamlong

streamlong

粉丝 21
博文 45
码字总数 16725
作品 0
杭州
私信 提问
Java中如何创建一个确保唯一的名字,文件名

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客要讲的有,如何创建一个唯一的文件名,创建一个唯一的String字符串 为什么要创建唯一呢?再很多情况下,比如文件上...

晨曦Dawn
07/14
0
0
sqlserver字符串处理函数大全

-- ╔══════════╗ -- ===================================== ║ Cast 函数转换 ║ -- ╚══════════╝ -- CAST() 函数语法如下: -- CAST ( AS [ length ]) /* 【0...

ty2538402559
2017/10/27
0
0
RDIFramework.NET ━ .NET快速信息化系统开发框架钜献 V3.0 版本强势发布

继上个版本“RDIFramework.NET V2.9版本”的推出,受到了重多客户的认可与选择,V2.9版本是非常成功与稳定的版本,感谢大家的认可与长期以来的关注与支持。V3.0版本在V2.9版本的基础上做了重...

yonghu86
06/26
0
0
深入浅出puppet(二)

puppet基础进阶 =============================================================================== 概述: ==========================================================================......

逐梦小涛
2017/01/15
0
0
Jeecg开源社区/jeecg

JEECG 微云快速开发平台 当前最新版本: 3.7.1(发布日期:20170918) 前言: 随着 WEB UI 框架 ( EasyUI/Jquery UI/Ext/DWZ) 等的逐渐成熟,系统界面逐渐实现统一化,代码生成器也可以生成统...

Jeecg开源社区
2013/11/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JVM 中的守护线程

特点 通常由JVM启动 运行在后台处理任务,比如垃圾回收等 用户启动线程执行结束或者JVM结束时,会等待所有的非守护线程执行结束,但是不会因为守护线程的存在而影响关闭。 判断线程是否为守护...

小刀爱编程
15分钟前
1
0

参考 极客时间《数据结构与算法之美》

grace_233
28分钟前
2
0
谈谈KMP算法

KMP算法的资料网上已经一大把了,主要用来解决某个文本片段是否包含另一个子串问题。这里假设文本片段的长度n大于子串长度m,如: 文本串为ABCDABGHIJK 子串为 ABCDABE 在传统的暴力解法中当...

FAT_mt
30分钟前
3
0
NEO改进协议提案9(NEP-9)

文章目录 摘要 动机 详述 原生资产转移URI URI键 可用URI 键 映射 NEO 交易属性键 参考原生资产地址 例子 智能合约调用URI NEP-5 token 转移 URI Keys 例子 原理 实现 参考 摘要 本NEP描述了...

NEO-FANS
31分钟前
1
0
Canvas学习:globalCompositeOperation详解

  在默认情况之下,如果在Canvas之中将某个物体(源)绘制在另一个物体(目标)之上,那么浏览器就会简单地把源特体的图像叠放在目标物体图像上面。      简单点讲,在Canvas中,把图像...

SEOwhywhy
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部