함수 하나만 봐주십시오 선배님들! 0 3 2,787

by 폭군보노 날짜 [2012.03.08 17:10:18]


전공과 전혀 관련없는 전산직에 일하게 됐는데요 ^^;

날짜를 입력받고 정상적인 날짜 형식인지 체크하는 함수를 만들고 있습니다.

이정도까지는 했는데 뭔가 복잡하고 부족합니다. ^^; 조언 좀 부탁드리고 싶습니다!


create or replace
FUNCTION FN_DAY_CHK_1 ( I_DAY IN VARCHAR2 )

RETURN NUMBER

IS
   V_DAY NUMBER;
   V_LEN NUMBER;
   V_MM  VARCHAR2(2);
   V_DD  VARCHAR2(2);
  
BEGIN

-- 공백 체크
   IF NVL(I_DAY, ' ') = ' ' THEN
  RETURN -1;
   END IF;

   V_LEN := LENGTH(I_DAY);
  
-- 월 체크
   V_MM := SUBSTR(I_DAY, 5, 2);
   IF (TO_NUMBER(V_MM) > 12) THEN
  RETURN -2;
   END IF;
  
-- 일 체크
   V_DD := SUBSTR(I_DAY, 7, 2);
   IF (TO_NUMBER(V_DD) > 31) THEN
  RETURN -3;
   END IF;

-- 윤달인 해에 29일 넘겼을 때
   IF ((MOD(SUBSTR(I_DAY, 1, 4), 4) = 0 AND MOD(SUBSTR(I_DAY, 1, 4), 100) <> 0)
  OR MOD(SUBSTR(I_DAY,1,4),400)=0)
  AND SUBSTR(I_DAY,5,2) = 02
  AND SUBSTR(I_DAY,7,2) > 29 THEN
  RETURN -4;
   END IF;

-- 윤달이 아닌 해에 28일 넘겼을 때  
   IF MOD(SUBSTR(I_DAY, 1, 4), 4) <> 0
  AND SUBSTR(I_DAY, 5, 2) = 02
  AND SUBSTR(I_DAY, 7, 2) > 28 THEN
  RETURN -5;
   END IF;

-- 에러없이 8자리인 경우
   IF V_LEN = 8 THEN
  RETURN 0;
   END IF;

-- 8자리가 아닌 경우
   IF V_LEN <> 8 THEN
  RETURN -6;
   END IF;

EXCEPTION
   WHEN OTHERS THEN
  RETURN -7;

END;

by 손님 [2012.03.09 09:38:23]

create or replace
FUNCTION FN_DAY_CHK_1 ( I_DAY IN VARCHAR2 )

RETURN String

IS
BEGIN
        /*변환에 성공하면 1이 리턴되고 실패하면 에러 예외가 발생되며 에러 메세지 출력*/
    select to_Date(relpace(I_DAY ,' ',''),'mmdd') from dual;
    return 1;

EXCEPTION
   WHEN OTHERS THEN
  RETURN SQLERRM;

END;


by 손님 [2012.03.09 09:43:22]
아. 실수 위 년도 포함 이네요.

select to_Date(relpace(I_DAY ,' ',''),'mmdd') from dual;  을

select to_Date(relpace(I_DAY ,' ',''),'yyyymmdd') from dual;
으로~



by 폭군보노 [2012.03.12 10:06:52]

이렇게 짧게 될 것을... ^^;; 감사합니다!!

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