文档章节

自定义年龄函数 ★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
杭州
sqlserver字符串处理函数大全

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

ty2538402559
2017/10/27
0
0
Java中如何创建一个确保唯一的名字,文件名

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

晨曦Dawn
07/14
0
0
RDIFramework.NET ━ .NET快速信息化系统开发框架钜献 V3.0 版本强势发布

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

yonghu86
06/26
0
0
Jeecg开源社区/jeecg

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

Jeecg开源社区
2013/11/18
0
0
深入浅出puppet(二)

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

逐梦小涛
2017/01/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

申请Let's Encrypt永久免费SSL证书

环境安装 1、安装git yum install git-core 2、安装python 系统自带 不用安装 只要版本大于2.7即可。 获取Let's Encrypt免费SSL证书 先停止nginx 在阿里云安全组里加入 443端口的入规则 git ...

HGMrWang
25分钟前
0
0
如何使用playframework进行更好的开发

1: 自定义基类Controller 相信刚开始使用Play的人写的Controller 都继承于 play.mvc.Controller , 但这并不是一个很好的选择,自建基类Controller可以扩展更多的功能。 1.1 验证功能。 后台...

tuerqidi
30分钟前
3
0
解决ubuntu下root用户 不能ftp登陆的问题

解决ubuntu下root用户 不能ftp登陆的问题 一般情况下,由于种种原因ftp是不让root用户远程登陆,但只要你修改以个文件就可以登陆了. 注释掉 /etc/ftpusers 中的root即可 (最后重启vsftpd serv...

15834278076
42分钟前
0
0
《JavaScript高级程序设计(第3版)》阅读笔记

第6章 面向对象的程序设计 6.2 创建对象 6.2.1 工厂模式 JavaScript创建对象(一)—— 工厂模式 6.2.2 构造函数模式 JavaScript创建对象(二)——构造函数模式 6.2.3 原型模式 JavaScript...

Bob2100
47分钟前
0
0
Windows小技巧 – Win+R提高Windows使用效率

追求效率的朋友都需要一款顺手的快速启动工具,Win 平台上有键盘流的RunZ、Listary、ALTRun、Launchy、Wox 和图标流的 Fences、Rolan、 WinLaunch 等,而 Mac 上也有 Alfred、Spotlight。 而...

QQZZFT
49分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部