작성
·
259
0
안녕하세요!
-- 고객명 Antonio Moreno이 1997년에 주문한 주문 정보를 주문 아이디, 주문일자, 배송일자, 배송 주소를 고객 주소와 함께 구할것.
이 문제에서, 1997년에 주문한 주문 정보 where절 작성할 때
where b.order_date between '19970101' and '19971231'
이렇게 작성해도 1997년 주문 정보가 추출이 되는 거 같은데, 강의에서
between to_date('19970101', 'yyyymmdd') and to_date('19971231', 'yyyymmdd')
이렇게 to_date라고 쓰신 이유가 따로 있을까요?!
답변 1
0
안녕하십니까,
order_date는 명확하게 Date 타입 컬럼입니다.
때문에 order_date가 where 조건으로 비교될 때 Date값으로 비교해 주는게 좋습니다.
적어주신대로 where b.order_date between '19970101' and '19971231' 같이 SQL을 사용하면 order_date가 Date 컬럼인데 문자열인 '19970101', '19971231'로 비교하기 때문에 DB에서 SQL을 내부적으로 자동 변경하게 됩니다.
즉 where b.order_date between '19970101' and '19971231' 로 SQL을 적었지만 DB내의 SQL Parser에서 내부적으로 where to_char(b.order_date, 'yyyymmdd') between '19970101' and '19971231' 와 같이 order_date를 to_char(order_date, 'yyyymmdd')로 문자열로 변경하여 비교를 하게 됩니다.
해당 과정은 사용자에게 보여지지 않기 때문에 where b.order_date between '19970101' and '19971231' 를 적용해도 동일한 결과가 나오지만 만약 order_date에 index가 달려 있다면 where to_char(b.order_date, 'yyyymmdd') between '19970101' and '19971231' 는 order_date를 to_char로 변경하기 때문에 index를 타지 못해서 SQL 성능 저하가 발생할 수 있습니다.
요약 드리자면 Date 타입의 컬럼을 where절에서 비교하고자 한다면 Date 값으로 비교하는 게 정석이며, String값으로 비교할 수도 있지만 이는 DB내부적으로 SQL 변환이 일어나서 가능한 것이며, 성능 저하가 발생할 우려를 가지고 있습니다.
감사합니다.