일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 첫연말정산
- 디지털 IT
- 프로그래머스
- 책리뷰
- 사회초년생목돈
- 한능검
- 기술면접
- NCS 디지털
- ncs it
- SAP
- 컴활1과목요약
- 디지털 상식
- 디지털 용어정리
- 장외파생상품
- 알고리즘
- 정처기 약술형
- 코딩테스트
- IT상식
- 플라잉요가고통
- 사회초년생목돈모으기
- 금융IT
- Python
- 네트워크관리사 2급 실기
- 파이썬
- 플라잉요가후기
- 연말정산처음
- 5년안에1억모으기
- 사회초년생1억모으기
- 디지털 IT 용어
- SAP SD
Archives
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 첫연말정산
- 디지털 IT
- 프로그래머스
- 책리뷰
- 사회초년생목돈
- 한능검
- 기술면접
- NCS 디지털
- ncs it
- SAP
- 컴활1과목요약
- 디지털 상식
- 디지털 용어정리
- 장외파생상품
- 알고리즘
- 정처기 약술형
- 코딩테스트
- IT상식
- 플라잉요가고통
- 사회초년생목돈모으기
- 금융IT
- Python
- 네트워크관리사 2급 실기
- 파이썬
- 플라잉요가후기
- 연말정산처음
- 5년안에1억모으기
- 사회초년생1억모으기
- 디지털 IT 용어
- SAP SD
Archives
- Today
- Total
공부기록장
[오라클] date YYYY-MM-DD 변환 함수 만들기 (to_char, to_date) 본문
서로 다른 날짜 형식을 일정한 포맷으로 반환하는 오라클 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;
코드에 대한 설명은 다음 포스팅으로 ㅎㅎ
'▶ study > SQL' 카테고리의 다른 글
[오라클] date YYYY-MM-DD 변환하는 방법 (0) | 2021.05.04 |
---|---|
[오라클] 특정문자 값 연달아 지우기 (replace) (0) | 2021.05.04 |
[SQL] 한 테이블에만 있는 값 출력하기 (테이블 빼기, left outer join) (0) | 2021.04.23 |
[SQL] SQL select문 실행 순서 (0) | 2021.04.16 |
[SQL심화] IN, NOT IN, EXISTS, NOT EXISTS 상세 비교 정리 (0) | 2021.04.15 |
Comments