처리시간(점심시간,퇴근시간고려한) 구하기 함수.. 0 2 4,422

by 옹네 [2009.06.11 20:30:33]


안녕하세요.
염치불구 또 질문올립니다...

날짜 두개가 있습니다.

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;
/

by 마농 [2009.06.12 14:37:47]
기준이 모호하네요.
만약 2일에 걸쳐서 1시간, 4시간 총 5시간 일했다면?
각각 0.3 + 1 = 1.3인가요? 아니면 총 5시간이므로 1 인지요? 아니면 2일이므로 2인가요?
또 3일에 걸쳐서 1시간, 하루 1시간 일했다면( 17시~ 다다음날 10시)
0.3 + 1 + 0.3 = 1.6 or 총 10시간 = 1.3 or 총3일 = 3 ???

by 글쓴이 [2009.06.13 06:23:46]
만약 2일에 걸쳐서 1시간, 4시간 총 5시간 일했다면?
-- 이건 3시간 초과분이니까 2일로 쳐야 합니다.
3일에 걸쳐서 (휴일제외한) 일한건 3일입니다.
만약 금요일 오후 3:30 분에 접수하고, 월요일 오전 9시20분에 처리했다면
근무날짜로 하면, 금,월 2일이지만 접수시간부터 일처리완료한
실제 처리시간 기준이므로 이것은 0.3 입니다.

처리시간이 3시간 이내인것은 0.3, 그 이상인 것은
날짜수를 리턴하는게 위의 결과2 입니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입