다잇소


[IT/트랜드] 알아두면 편리한 SQL TIP 2018년 – 1

2018.01.03
안녕하세요. 오랫만입니다. 

 

아래같이 날자형 컬럼을 문자타입으로 설정시 (시작년월일,시작시간) 형태로 일자와 시간을 분리하여 컬럼을 구성하는 경우가 있죠?

CREATE TABLE INST1.TAB10
(
로그인ID VARCHAR2(20) NOT NULL,
시작년월일 CHAR(8) NOT NULL,
시작시간 CHAR(4) NOT NULL,
………
……..
)
범위
. 시작년월일 : YYYYMMDD
. 시작시간 : HHMM => 0001 ~ 2359
이경우 데이타 이행이나 클렌징작업을 할때 시작시간이 정당한지 유효성 검증을 해야할때 사용하는 방법입니다.

시작년월일의 유효성검증은 다음 연재때 다루고 이번에는 시간(HHMM)의 유효성검증만 알아보겠습니다.
먼저 시작시간의 정당한 범위(0001 ~ 2359) 를 먼저 구하는 SQL을 작성합니다.

SELECT TO_CHAR(TO_DATE(‘0000′ ,’HH24MI’) + (LEVEL-1)/(24*60), ‘HH24MI’) 시분
FROM DUAL
CONNECT BY TO_DATE(‘0000′ ,’HH24MI’) + (LEVEL-1)/(24*60) <= TO_DATE(‘2359′ ,’HH24MI’)
그림1
그다음 해당 테이블의 시작시간이 위에서 정의한 정당한 범위에 존재하는지 비교합니다.

아래의 SQL을 수행하면 정당한 범위 이외의 데이타가 추출될 것입니다.

WITH TMP AS
(
SELECT TO_CHAR(TO_DATE(‘0000′ ,’HH24MI’) + (LEVEL-1)/(24*60), ‘HH24MI’) 시분
FROM DUAL
CONNECT BY TO_DATE(‘0000′ ,’HH24MI’) + (LEVEL-1)/(24*60) <= TO_DATE(‘2359′ ,’HH24MI’)
)
SELECT *
FROM INST1.TAB10 A
WHERE 시작시간 NOT IN (SELECT 시분 FROM TMP WHERE 시분 IS NOT NULL )
그림2
위에서 조회 그림에서 확인하면 시작시간 컬럼이 ‘0061’ 인데 분이 61분은 정당한 시간값이 아닙니다.
성능을 고려한다면 플랜을 보고 실행계획의 조정이 필요한 부분이 있지만 그 이상의 내용은 배치튜닝에 대한 사내교육 시간에 다루어 보도록 하겠습니다.
김 석기의 프로필 사진
| Wise리더
관심분야 데이타베이스 Sql튜닝

TAG >
http://daitso.kds.co.kr/67496/ 주소복사
카테고리 레이어 닫기