[Oracle] 날짜 검색방법(자료형변환 Between사용방법)및 주의사항

일반적으로 날짜를 조건으로 검색할때 그냥 대소비교로 검색할 것이다. 

 

ex) 2019년 07월 01일 보다 큰 리스트 조회(REGDATE의 자료형은 DATE이다.)

SELECT * 
    FROM 테이블명
    WHERE REGDATE > '20190701';
 

 

하지만 이건 잘못된 코딩 방법이다.  왜냐하면 REGDATE 자료형이 DATE이고 '20190701'은 문자열 이기 때문이다. 자료형이 다른걸 비교 하는건 원래는 시스템상 오류가 난다. 오라클에선 개발자들이 이런 실수를 많이 하는것을 알고 버전이 올라가면서 자료형을 자동으로 맞춰주도록 개선해 주었다. 버전 마다 다른 결과를 내는 코딩은 결코 좋은 습관이 아니다.

때문에 자료형을 맞춰 주기 위해 한쪽을 DATE 자료형을 문자열로 바꿔주던가 문자열을 DATE로 형변환 시켜줘야 한다.

 

왜냐하면 퍼포먼스를 높이기 위함인데 REGDATE가 자료형이 DATE고 '20190701'의 자료형은 VARCAHR2 이기때문에 

자료형을 맞춰주기 위해 한쪽을 먼저 자료형을 맞춰줘야 하기 때문에 만약 10만건을 검색한다 하면은 모두 자료형을 변경 해주고 나서 비교를 들어가기 때문에 퍼포먼스가 떨어진다. 

 

그래서 한쪽의 자료형을 내가 바꿔주는게 퍼포먼스를 높이는 것이다.

 

 

DATE 자료형을 문자열로 변경하는 법

ex) 2019년 07월 01일 보다 큰 리스트 조회

SELECT * 
    FROM SIS_ITEM
    WHERE TO_CHAR(REGDATE, 'YYYYMMDD'> '20190701';
 

 

TO_CHAR은 문자열로 변경해주는 함수이다. 뒤에 'YYYYMMDD'를 붙여주는 이유는 DATE자료형은 시분초 까지 있기 때문에 그냥 문자열로 변경했을때 '2018/12/03 17:29:59' 이런식으로 된다. 그래서 형식까지 변경해주기 위해 'YYYYMMDD'를 붙여주는 것이다. 이렇게 바꿔줬을때 원하는 날짜를 검색할 수 있다.

 

문자열을 DATE형으로 바꾸는 법

ex) 2019년 06월 01일 이상 2019년 08월 01일 이하 리스트 조회

SELECT *
    FROM SIS_ITEM
    WHERE REGDATE >= TO_DATE('20190601', 'YYYYMMDD') AND REGDATE <= TO_DATE('20190801');
 
SELECT *
    FROM SIS_ITEM
    WHERE REGDATE BETWEEN TO_DATE('20190601', 'YYYYMMDD') AND TO_DATE('20190801');
 

위에 2개 코드는 같은 결과를 보여주지만 아래는 BETWEEN을 썼다. BETWEEN을 사용하는것이 더 편하다.

여기서도 주의할 점은 문자열에 TO_DATE 함수를 써서 DATE 자료형으로 변경해 주어야 하는것이다. 

 

 

댓글

Designed by JB FACTORY