▶ study/SQL
[오라클] date YYYY-MM-DD 변환 함수 만들기 (to_char, to_date)
친절한 3
2021. 5. 4. 10:51
서로 다른 날짜 형식을 일정한 포맷으로 반환하는 오라클 function을 만들었다.
해결하고자 하는 문제
원하는 입력값과 출력 값은 다음과 같다. 일정하지 않은 날짜 형식을 YYYY-MM-DD형태로 바꿔주려고 한다.
e,g1)YYYYMMDD --> YYYY-MM-DD
e,g2)YYYY-MM-DD;YYYYMM-DD;YYYY-MMDD --> YYYY-MM-DD;YYYY-MM-DD;YYYY-MM-DD
e,g3)YYYYMMDD;YYYYMMDD;YYYYMMDD --> YYYY-MM-DD;YYYY-MM-DD;YYYY-MM-DD
문제 해결 절차
1) replace function을 사용해서 ';' 삭제
2) replace function을 사용해서 '-' 삭제
3) 각각의 데이터를 8자리씩 parsing
4) 8자리씩 parsing 한 데이터를 YYYY-MM-DD 형식으로 변경
5) 날짜가 두개이상 있으면 ';'로 구분
6) 마지막 날짜에는 ';'있으면 안 됨.
function
CREATE OR REPLACE FUNCTION TRPROD.FN_CHECK_SH (iDate VARCHAR)
RETURN VARCHAR2 IS
oDate VARCHAR2(5000); --inputdata
oLength NUMBER(10,0);
vDateLeng NUMBER(10,0);
vLoopCnt NUMBER(10,0);
newLength NUMBER(10,0);
vParsingDate VARCHAR(5000);
newParsingDate VARCHAR2(5000);
BEGIN
vLoopCnt := 0;
vDateLeng := 8;
SELECT REPLACE(REPLACE(iDate, ';', ''), '-', '') AS out_DATE, LENGTH(REPLACE(REPLACE(iDate, '-', ''), ';', '')) AS out_LENGTH
INTO oDate, oLength
FROM DUAL;
newLength := oLength/vDateLeng;
WHILE (newLength > 0) LOOP
SELECT SUBSTR(oDate, 1 + vLoopCnt * vDateLeng, vDateLeng) -- 1, 9, 17...
INTO vParsingDate
FROM DUAL;
SELECT TO_CHAR(TO_DATE(vParsingDate,'YYYYMMDD'),'YYYY-MM-DD')
INTO vParsingDate
FROM DUAL;
IF newLength > 1 then
newParsingDate := concat(concat(newParsingDate, vParsingDate),';');
ELSE
newParsingDate := concat(newParsingDate, vParsingDate);
END IF;
newLength := newLength - 1;
vLoopCnt := vLoopCnt + 1;
END LOOP;
RETURN newParsingDate;
END;
코드에 대한 설명은 다음 포스팅으로 ㅎㅎ