获取时间段数据

create or replace function getDateDuan(vChuSSJ varchar2,aFlag varchar2) return integer as
vDate date;
p_nl_str varchar2(20);
p_nl_s number;
p_nl_y number;
p_nl_t number;
p_nl_xs number;
p_rtnmsg varchar2(200);
p_dbmsg varchar2(200);
begin
vDate := to_date(vChuSSJ,'yyyy-MM-dd hh24:mi:ss');
prc_get_age(vDate,p_nl_str,p_nl_s,p_nl_y ,p_nl_t,p_nl_xs,p_rtnmsg,p_dbmsg);

if aFlag = '岁' then
return p_nl_s;
end if;

if aFlag = '月' then
return p_nl_y;
end if;

if aFlag = '天' then
return p_nl_t;
end if;

if aFlag = '时' then
return p_nl_xs;
end if;

end;

-------------------------------------------------------------------------------------

CREATE OR REPLACE PROCEDURE prc_get_age(p_bir DATE, --出生日期
p_nl_str OUT VARCHAR2, --年龄 N岁(包含中文)
p_nl_s OUT NUMBER, --岁
p_nl_y OUT NUMBER, --月
p_nl_t OUT NUMBER, --天
p_nl_xs OUT NUMBER, --小时
p_rtnmsg OUT VARCHAR2, --1成功, 其它失败
p_dbmsg OUT VARCHAR2 --数据库错误信息
) IS
--解析年龄 岁 月 天
v_i NUMBER;
BEGIN
p_rtnmsg := '1';

--出生日期不为空
IF p_bir IS NULL THEN
p_rtnmsg := '计算年龄时,出生日期不能为空!';
RETURN;
END IF;

--判断出生日期与当前时间
IF p_bir > SYSDATE THEN
p_rtnmsg := '计算年龄时,出生日期不能大于当前日期!';
RETURN;
END IF;

v_i := MONTHS_BETWEEN(SYSDATE, p_bir);

p_nl_s := TRUNC(v_i / 12);
p_nl_y := TRUNC(MOD(v_i, 12));
p_nl_t := TRUNC(SYSDATE - ADD_MONTHS(p_bir, TRUNC(v_i)));

p_nl_xs := 0; --默认0
--若年龄 岁、月、天 都为0时,计算小时
IF p_nl_s = 0
AND p_nl_y = 0
AND p_nl_t = 0 THEN
p_nl_xs := ROUND((SYSDATE - p_bir) * 24); --小时
END IF;

--返回拼接 年龄 中文 两种方式
--返回拼接年龄中文, 对应 岁、月、天
IF p_nl_s < 1
AND p_nl_y > 0 THEN
p_nl_str := TO_CHAR(p_nl_y) || '月';
ELSIF p_nl_s < 1
AND p_nl_y = 0 THEN
p_nl_str := TO_CHAR(p_nl_t) || '天';
ELSE
p_nl_str := TO_CHAR(p_nl_s) || '岁';
END IF;
/*--返回拼接年龄中文, 分区间 {0~1},{1~7},{7~∞}
IF (p_nl_s >= 7) THEN
p_nl_str := TO_CHAR(p_nl_s) || '岁';
ELSIF (p_nl_s >= 1)
AND (p_nl_s < 7) THEN
p_nl_str := TO_CHAR(p_nl_s) || '岁' || TO_CHAR(p_nl_y) || '月';
ELSE
p_nl_str := TO_CHAR(p_nl_y) || '月' || TO_CHAR(p_nl_t) || '天';
END IF;*/

EXCEPTION
WHEN OTHERS THEN
p_rtnmsg := '获取年龄发生错误,请联系管理员!';
p_dbmsg := DBMS_UTILITY.FORMAT_ERROR_BACKTRACE || SQLERRM;
END prc_get_age;

原文地址:https://www.cnblogs.com/maweiwei/p/13937779.html