안녕하세요.
염치불구 또 질문올립니다...
날짜 두개가 있습니다.
from_dt, to_dt
이 두개의 날짜의 소요시간을 구합니다.
공휴일, 토요일, 일요일도 고려가 되어야 하고 (이건 휴일 관리하는 테이블이 있습니다.)
막히는 부분은,
시간부분인데요....
시간부분에서 점심시간과 퇴근시간, 출근시간전은 근무시간으로 인정하지 않기 때문에
소요된 시간에 포함되어서는 안됩니다.
총 처리시간이 3시간 이내에 들어있는것은 0.3
3시간 초과분 부터는 날짜차이 (일수) 를 보이는것이 (아래의 결과2) 최종 목표이지만,
표의 결과1 로 리턴받아 나름 다른곳에서도 유용하게 사용하고 싶습니다. ㅡㅡ;;
시간이 너무너무 어렵네욥. ㅠㅠ
아래 펑션은 시간계산이 쏙 빠진 (점심시간, 퇴근시간..) 날짜 계산만 들어간
제가 작성한 부분입니다... (맞는지도 모르겠구요... ㅠㅠ)
도와주세요...
접수(From) | 완료(To) | 결과1 | 결과2 | 설명 |
2009-06-01 13:00:00 | 2009-06-01 14:00:00 | 0일2시간0분0초 | 0.3 | 평범한 날짜 |
2009-06-01 11:00:00 | 2009-06-01 15:00:00 | 0일3시간00분0초 | 0.3 | 점심시간을 뺀 시간이 들어감(3시간까지는 0.3으로 표기) |
2009-06-01 15:30:00 | 2009-06-02 09:30:00 | 0일3시간0분0초 | 0.3 | 다음날로 넘어갔으나 퇴근시간 이후라 처리시간은 3시간으로 봐야 함 |
2009-06-05 15:30:00 | 2009-06-08 15:30:00 | 0일3시간0분0초 | 0.3 | 위의문제+주말문제발생. 그러나 처리시간은 3시간으로 봐야 함 |
2009-06-01 15:30:00 | 2009-06-08 15:30:00 | 6일3시간0분0초 | 6 | 주말도 끼고 위의 문제와 겹침 (하루이상인것은 그냥 날짜차이만 계산) |
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_hour varchar2(5) := ’0’;
str_min varchar2(5) := ’0’;
str_sec varchar2(5) := ’0’;
STR_RESULT VARCHAR2(20) := ’0’;
BEGIN
BEGIN
SELECT COUNT(*) WORK_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_HOUR, STR_MIN, STR_SEC
FROM SWCUMP -- 휴일관리되는 테이블
WHERE syymmdd between from_dt and to_dt
AND STIME = 8; -- 근무시간이 8인것들이 근무날 8이 아닌것은 휴일임
EXCEPTION
WHEN NO_DATA_FOUND THEN
STR_RESULT := 0;
WHEN OTHERS THEN
STR_RESULT := 0;
END;
IF TO_NUMBER(STR_WORK_DAY) <= 1 then
-- 이곳에 근무시간(09:00~18:00), 점심시간 고려한 루틴필요
-- 3시간 이내에 처리한것은 0.3 으로 리턴, 그외는 1로 리턴
STR_RESULT := ’0.3’;
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;
/