-- 알려드린 조인조건 하나는 아예 빼먹으셨네요. 잘 확인하고 적용하세요. -- iodt 는 date 타입이 맞나요? date 타입의 경우 Between 사용시 유의하셔야 합니다. -- 날짜만 저장된 경우엔 아래와 같이 해도 문제 없지만 -- 시분초까지 저장된 경우엔 아래와 같이 하면 마지막날 자료는 누락되게 됩니다. -- 날짜함수사용이 군더더기가 많네요. SELECT co140c.itmnm , ib010d.itm , ib010d.qty , ib010d.amt , ib030s.iqty , ib030s.iamt , ib010d.qty - NVL(ib030s.iqty, 0) AS sqty , ib010d.amt - NVL(ib030s.iamt, 0) AS samt FROM ib010m , ib010d , ib030s , co140c WHERE ib010m.ino = ib010d.ino AND co140c.itm = ib010d.itm AND ib010m.iodt BETWEEN TO_DATE(:as_yymm, 'yyyymm') AND LAST_DAY(TO_DATE(:as_yymm, 'yyyymm')) AND ib030s.itm(+) = ib010d.itm AND ib030s.ym(+) = :as_yymm ;
인공지능이라서 알아서 28일까지만 계산하는게 아니죠.
'28' 이 '31' 보다 작기 때문에 조건에 맞아서 나오는 것 뿐이죠.
만약 '0231' 이나 '0230' 등의 오류자료가 들어 있다면 이자료도 함께 나오겠지요.
다만 '0299' 등의 오류자료가 있다면? 이는 안나오겠지요.
LIKE 조건을 준다면 이자료도 나올거구요.
그냥 '31' 을 붙여준것은 편의상 그렇게 한것이고(28, 29, 30, 21 조건에 따라 나누기 귀찮아서)
또한, 오류자료가 없다는 묵시적인 가정하에 그렇게 한것입니다. 문자열의 특성까지 고려해서.
LIKE 로 해도 무방하구요.
다만 경우에 따라서 LIKE 가 BETWEEN 보다 늦는 경우가 발생할수도 있습니다.
"경우에 따라서"라는 전제조건 달았습니다.
"경우에 따라서"를 강조하는 것은 이런 전제조건을 앞에 달아도 대부분이 뒤에만 보고 뒤에만 암기식으로 외워버립니다.
그리고는 "LIKE 가 BETWEEN 보다 항상 늦다더라" 하고 공식화 시켜버리는 경우를 종종 체험해서...
결론은 성능상으론 거의 차이가 없습니다만.
경우에 따라서 LIKE 가 BETWEEN 보다 늦는 경우도 있으니
왠만하면 BETWEEN 을 사용하시는 것이 좋습니다.