아무튼 원하는 결과는 나오기는 합니다만,
조금 다듬어야 할 것 같아요... (아니, 많이요...ㅠㅠㅠㅠ)
CREATE OR REPLACE FUNCTION CUSTOMER.FUN_CALC_WORKDATE (
/**********************************************************************************/
/* 1. 시 스 템 명 : 상수도사업본부 고객지원 */
/* 2. 개 요 : 두날짜간 차이 (휴일,점심시간,근무시간고려함) */
/* 3. 관 련 테 이 블 : swcump */
/* 4. PARAMETER : FROM_DATETIME, TO_DATETIME */
/* 5. RETURN VALUE : */
/* 6. 작 성 자 : KIM.O.R. */
/* 7. 작 성 일 자 : 2009.06 */
/**********************************************************************************/
from_dt VARCHAR2, -- 시작일자
to_dt VARCHAR2, -- 종료일자
from_tm VARCHAR2, -- 시작시간
to_tm VARCHAR2 -- 종료시간
)
RETURN VARCHAR2 IS
str_work_day varchar2(5) := '0';
str_day varchar2(5) := '0';
str_hour varchar2(5) := '0';
str_min varchar2(5) := '0';
str_sec varchar2(5) := '0';
hour1 number(10) := 0;
hour2 number(10) := 0;
hour3 number(10) := 0;
STR_RESULT VARCHAR2(20) := '0';
BEGIN
BEGIN
SELECT COUNT(*) WORK_DAY --휴일계산한 날짜수
,LPAD(TRUNC( to_date(to_dt||to_tm, 'YYYYMMDDHH24MISS') - to_date(from_dt||from_tm, 'YYYYMMDDHH24MISS')), 2, '0') DAY
,LPAD(TRUNC(MOD(( to_date(to_dt||to_tm, 'YYYYMMDDHH24MISS') - to_date(from_dt||from_tm, 'YYYYMMDDHH24MISS')),1)*24), 2, '0') HOUR
,LPAD(TRUNC(MOD(( to_date(to_dt||to_tm, 'YYYYMMDDHH24MISS') - to_date(from_dt||from_tm, 'YYYYMMDDHH24MISS'))*24,1)*60), 2, '0') MINUTE
,LPAD(TRUNC(MOD(( to_date(to_dt||to_tm, 'YYYYMMDDHH24MISS') - to_date(from_dt||from_tm, 'YYYYMMDDHH24MISS'))*24*60,1)*60), 2, '0') SEC
INTO STR_WORK_DAY, STR_DAY, STR_HOUR, STR_MIN, STR_SEC
FROM SWCUMP
WHERE syymmdd between from_dt and to_dt
AND STIME = 8;
EXCEPTION
WHEN NO_DATA_FOUND THEN
STR_RESULT := 0;
WHEN OTHERS THEN
STR_RESULT := 0;
END;
IF TO_NUMBER(STR_WORK_DAY) <= 1 or to_number(str_day) = 0 then
-- 이곳에 근무시간(09:00~18:00), 점심시간 고려한 루틴필요
if to_number(str_hour) > 3 then
--점심시간 (9시0분0초보다크면 무조건 점심시간에 걸리기 때문)
if to_date(from_tm, 'HH24MISS') > to_date('090000', 'HH24MISS') and to_date(from_tm, 'HH24MISS') < to_date('120000', 'HH24MISS') then
str_hour := to_number(str_hour) -1;
if to_number(str_hour) > 3 then
STR_RESULT := '1';
else
STR_RESULT := '0.3';
end if;
end if;
--퇴근시간 (근무시간내에 접수하고, 3시 이후에 넘어간것들은 다음근무날로 넘어감)
if to_date(from_tm, 'HH24MISS') > to_date('150000', 'HH24MISS') and to_date(from_tm, 'HH24MISS') < to_date('180000', 'HH24MISS') then
hour1 := to_date('180000', 'HH24MISS') - to_date(from_tm, 'HH24MISS'); -- 접수시간부터 퇴근시간까지의 소요시간
hour2 := to_date(to_tm, 'HH24MISS') - to_date('090000', 'HH24MISS'); -- 출근시간(09:00) 부터 처리완료시간까지의 소요시간
hour3 := hour1 + hour2;
hour3 := trunc(mod(hour3,1)*24) ;
if hour3 > 3 then
STR_RESULT := '1';
else
STR_RESULT := '0.3';
end if;
end if;
--점심시간이후, 오후3시이전접수건
if to_date(from_tm, 'HH24MISS') > to_date('120000', 'HH24MISS') and to_date(from_tm, 'HH24MISS') < to_date('150000', 'HH24MISS') then
if to_number(str_hour) > 3 then
STR_RESULT := '1';
else
STR_RESULT := '0.3';
end if;
end if;
--오전9시 이전에 접수한건
if to_date(from_tm, 'HH24MISS') < to_date('090001', 'HH24MISS') then
if to_date(to_tm, 'HH24MISS') > to_date('120000', 'HH24MISS') then
STR_RESULT := '1';
else
STR_RESULT := '0.3';
end if;
end if;
--퇴근시간 이후 접수한것은 무조건 다음근무날 기준 12시임
if to_date(from_tm, 'HH24MISS') > to_date('180000', 'HH24MISS') then
if to_date(to_tm, 'HH24MISS') > to_date('120000', 'HH24MISS') then
STR_RESULT := '1';
else
STR_RESULT := '0.3';
end if;
end if;
else
STR_RESULT := '0.3';
end if;
else
STR_RESULT := STR_WORK_DAY;
END if;
--STR_RESULT := STR_WORK_DAY || STR_HOUR || STR_MIN || STR_SEC;
RETURN STR_RESULT;
EXCEPTION
WHEN OTHERS THEN
return '0';
END FUN_CALC_WORKDATE;
/