function实例1:计算工作时间(开始时间,结束时间)
场景:信审系统需要开发一个function,用于计算每个流程节点占用的时间,以判断审核是否超时,超时相关参数如下:
1、每日工作时间 A:24小时 B:工作时间 ;
2、是否包含节假日: A 包含 B不包含
3、时间限制(单位/小时):输入项如24;
方案如下:
1、默认周末为休息日,其它特殊的工作日和假日需要记录在数据库中,建立一个工作日配置表 config_workday
(workday_config_id 主键
workday_type 工作日类型(字典,典型值如 0 休息日 1工作日)
date 日期(年月日,典型值如2011-07-20)
demo 说明、创建人、创建时间等5个字段
)
2、新建function:
计算起止时间之间花费的工作时间callWorkTime(v_start_time VARCHAR2, 开始时间
v_end_time VARCHAR2, 结束时间
v_is_include_holiday VARCHAR2,休息日是否计算在内
v_hours_for_day VARCHAR2) 每日工作时间
实现如下:
create or replace function callWorkTime(v_start_time VARCHAR2,
v_end_time VARCHAR2,
v_is_include_holiday VARCHAR2,
v_hours_for_day VARCHAR2)
return NUMBER is
v_total NUMBER := 0;
v_zhongjian NUMBER := 0;
v_current_time VARCHAR2(30) := v_start_time;
v_xinqi NUMBER := 1;
v_count NUMBER := 0;
v_is_holiday NUMBER := 0;
v_start_work_hour VARCHAR2(10) :=' 09:00:00';
v_end_work_hour VARCHAR2(10) :=' 17:00:00';
BEGIN
--设置上下班时间
IF(v_hours_for_day ='24') THEN
v_start_work_hour :=' 00:00:00';
v_end_work_hour :=' 23:59:59';
END IF;
WHILE v_current_time < v_end_time LOOP
IF (v_is_include_holiday = 0) THEN
---若统计时间不包含节假日,查出星期几,判断是否休息日
SELECT to_number(to_char(to_date(v_current_time,'YYYY-MM-DD HH24:MI:SS'),'d'))
INTO v_xinqi
FROM DUAL;
--如果是星期六(7)、日(1)
IF (v_xinqi = 7 OR v_xinqi = 1) THEN
SELECT COUNT(*) INTO v_count FROM tc_config_workday t WHERE t.work_day = substr(v_current_time,0,10) AND t.workday_type = '1';
IF v_count > 0 THEN
&nb