문자형으로 된 날짜를 YYYYMMDD 형태로 변환하는 함수를 만들고 있습니다.
2019년 -> NULL
2019년 01월, 2019년 1월, 2019년 1월 1일-> 20190101
SELECT GET_DATE_TO_YMD('2019') -- 결과값 : NULL -- 정상입니다.
, GET_DATE_TO_YMD('201903') -- 결과값 : 20190301 -- 정상
, GET_DATE_TO_YMD('2019년03월') -- 결과값 : 20190301 -- 정상
, GET_DATE_TO_YMD('2019년 03월') -- 결과값 : 20190301 -- 정상
, GET_DATE_TO_YMD('2019년 3월') -- 결과값 : 20190301 -- 정상
, GET_DATE_TO_YMD('2019년 3월 15일') -- 결과값 : 20190315 나와야 하는데.. NULL 입니다. ^^
FROM DUAL;
정규식을 사용해야 할것 같은데.. 방법은 모르겠고..
아래처럼 구현하다보니..
CASE만 늘어나서.. 정규식으로 심플하게 하는 방법이 있을것 같아..
도움 요청드립니다..
감사합니다.
CREATE OR REPLACE FUNCTION IDLOOK.GET_DATE_TO_YMD
(
in_STR_DATE IN VARCHAR2 -- 날짜(문자형)
)
/*******************************************************************************
* 프로그램ID : GET_DATE_STR
* 프로그램명 : 문자열 날짜를 YYYYMMDD 형태로 변환
* 샘플 : SELECT GET_DATE_TO_YMD('2019') -- 결과값 : NULL
, GET_DATE_TO_YMD('201903') -- 결과값 : 20190301
, GET_DATE_TO_YMD('2019년03월') -- 결과값 : 20190301
, GET_DATE_TO_YMD('2019년 03월') -- 결과값 : 20190301
, GET_DATE_TO_YMD('2019년 3월') -- 결과값 : 20190301
, GET_DATE_TO_YMD('2019년 3월 15일') -- 결과값 : 20190315
FROM DUAL;
*******************************************************************************
* 생성자 : 2019-03-12 XXXX
******************************************************************************/
RETURN VARCHAR2
IS
out_STR_DT VARCHAR2(50) := '';
v_TMP VARCHAR2(50);
BEGIN
BEGIN
IF in_STR_DATE IS NOT NULL THEN
v_TMP := REGEXP_REPLACE(in_STR_DATE, '[^0-9]'); -- 숫자만 추출
IF LENGTH(v_TMP) > 8 OR LENGTH(v_TMP) < 5 THEN
-- out_STR_DT := in_STR_DATE;
out_STR_DT := '';
ELSIF LENGTH(v_TMP) = 5 THEN
IF TO_NUMBER(SUBSTR(v_TMP, 1, 4)) >= 1900 AND TO_NUMBER(SUBSTR(v_TMP, 5, 1)) BETWEEN 1 AND 9 THEN
v_TMP := SUBSTR(v_TMP, 1, 4) || '0' || SUBSTR(v_TMP, 5, 1);
out_STR_DT := TO_CHAR(TO_DATE(RPAD(v_TMP, 8, '01')), 'YYYYMMDD');
ELSE
out_STR_DT := '';
END IF;
ELSE
out_STR_DT := TO_CHAR(TO_DATE(RPAD(v_TMP, 8, '01')), 'YYYYMMDD');
END IF;
END IF;
EXCEPTION
WHEN OTHERS THEN
out_STR_DT := '';
END;
RETURN out_STR_DT;
END GET_DATE_TO_YMD;
/
WITH t AS ( SELECT '2018' dt FROM dual UNION ALL SELECT '201802' FROM dual UNION ALL SELECT '2018.2' FROM dual UNION ALL SELECT '2018.02' FROM dual UNION ALL SELECT '2018.02.13' FROM dual UNION ALL SELECT '2018-02' FROM dual UNION ALL SELECT '2018-02-13' FROM dual UNION ALL SELECT '2018/12' FROM dual UNION ALL SELECT '2019 1 1' FROM dual UNION ALL SELECT '2018/12/01' FROM dual UNION ALL SELECT '2019년 1월' FROM dual UNION ALL SELECT '2019년 1월 1일' FROM dual UNION ALL SELECT '2019년 01월 01일' FROM dual UNION ALL SELECT '19년 1월 1일' FROM dual UNION ALL SELECT '99년 1월 1일' FROM dual UNION ALL SELECT '19년 13월 1일' FROM dual ) SELECT dt , TO_CHAR(TO_DATE(DECODE(gb, 1, x), 'rrrr-mm-dd'), 'yyyymmdd') x FROM (SELECT dt , CASE WHEN REGEXP_LIKE(x, '^[0-9]{4}-?[0-9]{1,2}$') THEN x||'-1' WHEN REGEXP_LIKE(x, '^[0-9]{2}-?[0-9]{1,2}$') THEN x||'-1' ELSE x END x FROM (SELECT dt , RTRIM(REGEXP_REPLACE(dt, '[^0-9]+', '-'), '-') x FROM t ) ) , XMLTABLE('if (. castable as xs:date) then 1 else 0' PASSING x COLUMNS gb NUMBER PATH '.') ;