文档章节

自定义年龄函数 ★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

粉丝 22
博文 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

day60-20180818-流利阅读笔记-待学习

钉钉:工作的归工作,生活的…也归工作? 毛西 2018-08-18 1.今日导读 你用过“钉钉”么?被公司要求使用钉钉的感受是如何的呢?这款阿里巴巴旗下的移动办公社交平台在弯道超车微信、为许多企...

aibinxiao
48分钟前
6
0
Kubernetes的HTTPS和证书问题,汇总

通过Kubernetes建立服务网站,需要干的事情和HTTPS和证书问题,汇总如下: 建立Nginx服务器 搞服务器第一步,Ubuntu 18.04设置静态IP 安装Nginx服务。 Kubernetes的deployment使用 创建服务,...

openthings
今天
2
0
php 使用redis锁限制并发访问类

1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功。 例如换领优惠券,如果用户同一时间并发提交换领...

豆花饭烧土豆
今天
0
0
Linux环境搭建 | 手把手教你配置Linux虚拟机

在上一节 「手把你教你安装Linux虚拟机」 里,我们已经安装好了Linux虚拟机,在这一节里,我们将配置安装好的Linux虚拟机,使其达到可以开发的程度。 Ubuntu刚安装完毕之后,还无法进行开发,...

良许Linux
今天
0
0
(三)Nginx配置·续

概述 前文写了关于Nginx环境配置,但是还没有完,接下来将会继续讲三个相关的配置 主要是以下三个 1.Nginx访问日志 2.Nginx日志切割 3.静态文件不记录日志和过期时间 Nginx访问日志 1.先看看...

杉下
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部