728x90
반응형
날짜 유효성 검사
날짜 데이터의 유효성을 확인하기 위한 함수로 데이터 형식에 따라 해당 형식에 맞는지 검사한다.
함수 인수
날짜값, 데이터 형식 (D - YYYYMMDD, T - YYYYMMDDHH24MISS)
구성
create or replace FUNCTION "FN_ISERR_DATE" (IN_STR IN VARCHAR2, IN_TYPE IN VARCHAR2) RETURN VARCHAR2 /**************************************************************************** /* 함수명 : FN_ISERR_DATE /* /* 설 명 : 날짜 유효성 검증 /* /* 인 수 : 날짜값, 년월일(D) or 년월일시분초(T) 타입값 /* /* 참고 사항 : 정규식 이용, 유효하지 않은 값은 빈값으로 리턴, 문자입력 시에도 빈값으로 리턴 /****************************************************************************/ IS V_RETURN VARCHAR2 (512); -- 결과값 V_STR VARCHAR2 (512); -- 입력값(날짜) V_YEAR VARCHAR2 (4); -- 입력값 내 년도 V_LEAF VARCHAR2 (1); -- 입력값 윤년 여부 V_REGEXP VARCHAR2 (512); -- 윤년 여부에 따른 정규식 V_TYPE VARCHAR2 (1); -- 년월일 or 년월일시분초 타입 BEGIN -- 입력값 공백제거 V_STR := TRIM(IN_STR); -- 년월일 or 년월일시분초 타입 V_TYPE := IN_TYPE; IF -- 빈값 V_STR IS NULL OR V_STR = '' THEN V_RETURN := ''; ELSIF -- 숫자이외 값 확인 REGEXP_INSTR(V_STR, '[^0-9]') != 0 THEN V_RETURN := ''; -- YYYYMMDD ELSIF V_TYPE = 'D' THEN IF -- 자리수(년월일) LENGTH(V_STR) != 8 THEN V_RETURN := ''; ELSE -- 날짜 및 윤년계산 V_YEAR := SUBSTR(V_STR, 0, 4); CASE WHEN (MOD(V_YEAR, 4) = 0 AND MOD(V_YEAR, 100) != 0) OR (MOD(V_YEAR, 400) = 0) THEN V_LEAF := 'Y'; ELSE V_LEAF := 'N'; END CASE; IF V_LEAF = 'Y' THEN V_REGEXP := '^[0-9]{4}(((0[13578]|(10|12))(0[1-9]|[1-2][0-9]|3[0-1]))|(02(0[1-9]|[1-2][0-9]))|((0[469]|11)(0[1-9]|[1-2][0-9]|30)))$'; ELSE V_REGEXP := '^[0-9]{4}(((0[13578]|(10|12))(0[1-9]|[1-2][0-9]|3[0-1]))|(02(0[1-9]|[1-2][0-8]))|((0[469]|11)(0[1-9]|[1-2][0-9]|30)))$'; END IF; CASE WHEN NOT REGEXP_LIKE(V_STR, V_REGEXP) THEN V_RETURN := ''; ELSE V_RETURN := V_STR; END CASE; END IF; -- YYYYMMDDHH24MISS ELSIF V_TYPE = 'T' THEN IF -- 자리수(년월일시분초) LENGTH(V_STR) != 14 THEN V_RETURN := ''; ELSE -- 날짜 및 윤년계산 V_YEAR := SUBSTR(V_STR, 0, 4); CASE WHEN (MOD(V_YEAR, 4) = 0 AND MOD(V_YEAR, 100) != 0) OR (MOD(V_YEAR, 400) = 0) THEN V_LEAF := 'Y'; ELSE V_LEAF := 'N'; END CASE; IF V_LEAF = 'Y' THEN V_REGEXP := '^[0-9]{4}(((0[13578]|(10|12))(0[1-9]|[1-2][0-9]|3[0-1]))|(02(0[1-9]|[1-2][0-9]))|((0[469]|11)(0[1-9]|[1-2][0-9]|30)))(([0-1][0-9]|2[0-4])([0-5][0-9])([0-5][0-9]))$'; ELSE V_REGEXP := '^[0-9]{4}(((0[13578]|(10|12))(0[1-9]|[1-2][0-9]|3[0-1]))|(02(0[1-9]|[1-2][0-8]))|((0[469]|11)(0[1-9]|[1-2][0-9]|30)))(([0-1][0-9]|2[0-4])([0-5][0-9])([0-5][0-9]))$'; END IF; CASE WHEN NOT REGEXP_LIKE(V_STR, V_REGEXP) THEN V_RETURN := ''; ELSE V_RETURN := V_STR; END CASE; END IF; END IF; RETURN V_RETURN; EXCEPTION -- 오류 WHEN OTHERS THEN V_RETURN := 'ERR'; RETURN V_RETURN; END FN_ISERR_DATE;
728x90
반응형
댓글