자작 허접 답변.. ㅡㅡ;; 0 0 2,106

by 옹네 [2009.06.12 11:38:57]


아무튼 원하는 결과는 나오기는 합니다만,

조금 다듬어야 할 것 같아요... (아니, 많이요...ㅠㅠㅠㅠ)

 

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

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