쉬울거 같으면서도 잘안되네요..
특정기간 '200511' ~ '200610' 동안의
년월을 구하고 싶습니다.
즉 200511
200512
200601
200602
200603
.
200610
이렇게 구하는 방법을 아시는 분은 도와주세요~~~ ^^;;
1.먼저 파라미터로 주어지는 두 날짜 사이의 개월 수에 1을 더한 값을 구합니다.
->11개월+1=12가 됩니다.
SELECT
MONTHS_BETWEEN(TO_DATE('200610','YYYYMM'),TO_DATE('200511','YYYYMM')) +1
FROM DUAL
2.아무 테이블이나 로우의 수가 위에서 구해진 12개 이상인 테이블에서 위 결과와 조인을 합니다.
SELECT * FROM (SELECT
MONTHS_BETWEEN(TO_DATE('200610','YYYYMM'),TO_DATE('200511','YYYYMM'))+1 COL1 FROM DUAL) A,(SELECT ROWNUM RM FROM TEST) BWHERE RM<=A.COL1
3.두 날짜 파라미터중 작은 값에 일련의 ROWNUM 값을 더하면서 두 날짜 사이의 월을 구합니다.
TO_CHAR(ADD_MONTHS(TO_DATE('200511','YYYYMM'),RM-1),'YYYYMM')FROM (SELECT
SELECT TO_CHAR (ADD_MONTHS (TO_DATE ('200511', 'YYYYMM'), LEVEL - 1), 'YYYYMM' ) mon FROM DUALCONNECT BY ADD_MONTHS (TO_DATE ('200511', 'YYYYMM'), LEVEL - 1) <= TO_DATE ('200610', 'YYYYMM') -- SQL 쿼리 질문은 SQL 까페에서... http://cafe.daum.net/oraclesqltuning
감사합니다.
이렇게 하면 되는군요.. ^^
장진주님 정말 간단하고도 위력적인 쿼리문이네요.
찬탄이 절로 나오는 군요. 좋은 쿼리 보여주셔서 감사합니다.
그런데 위 쿼리문이 9i에서는 잘 나오는데 8i에서는 루프에러가 나네요.
8i에서는 어떻게 하면 될까요?
그리고 제 머리로는 저 쿼리가 어떻게 돌아가는지 감을 못잡겠는데 설명해 주시면 정말 감사하겠습니다.
장진주님께서 말씀하신 connect by와 같은 구문은 오라클의 특정 버전에만 해당되는 구문입니다.
김강환님께서 말씀하신 방법이 8i에서는 효율적일 수 있습니다.
장진주님의 SQL 실행 결과는 오라클 10g (10.1)에서는 정상적으로 나옵니다. 오라클 9i(9.2)에서는 '200511'만 나옵니다.
9i에서는 다음과 같이 조금 수정하여 실행하면 좋을 듯 합니다.
select mon from (SELECT TO_CHAR (ADD_MONTHS (TO_DATE ('200511', 'YYYYMM'), LEVEL - 1), 'YYYYMM') mon FROM DUALCONNECT BY ADD_MONTHS (TO_DATE ('200511', 'YYYYMM'), LEVEL - 1) <= TO_DATE ('200610', 'YYYYMM'))
8i 이하에서 테스트 테이블을 사용할 경우에는,
dual을 사용하지 않아도 됩니다. 아래와 같이...
SELECT TO_CHAR (ADD_MONTHS (TO_DATE ('200511', 'YYYYMM'), ROWNUM - 1), 'YYYYMM' ) mon FROM TEST WHERE ADD_MONTHS (TO_DATE ('200511', 'YYYYMM'), ROWNUM - 1) <= TO_DATE ('200610', 'YYYYMM')
-- SQL 쿼리 질문은 SQL 까페에서... http://cafe.daum.net/oraclesqltuning
먼저, 위의 장진주님 쿼리로 하니까 '200511' 한 Row만 출력이 되네요..
제가 해 본 쿼리는 아래와 같습니다.
위의 내용들과 흡사할 수는 있습니다.^^
-- 월수 증가하기
[ 방법1]SELECT to_char(add_months(to_date(:st_ym, 'yyyymm') , rnum), 'yyyy/mm')FROM (SELECT ROWNUM rnum FROM tab WHERE ROWNUM <13)
==> 구간수치를 확실히 알고 있을 때는 13이라는 숫자를 지정
[방법2]
SELECT to_char(add_months(to_date(:st_ym, 'yyyymm') , rnum), 'yyyy/mm')FROM (SELECT ROWNUM rnum FROM tab WHERE ROWNUM < months_between(to_date(:ed_ym, 'yyyymm') , to_date(:st_ym, 'yyyymm'))+1)
==> 구간수치를 모를때 '시작'/'종료'일자를 입력
-- 일수 증가하기 (덤으로...^^)SELECT to_char(to_date(:st_ym, 'yyyymm') + rnum, 'yyyy/mm/dd')FROM (SELECT ROWNUM rnum FROM tab WHERE ROWNUM < (to_date(:ed_ym, 'yyyymm') - to_date(:st_ym, 'yyyymm') +1))
==> tab이라는 테이블에는 최소한 시작과 종료월의 구간 수보다 많은 Row가 있어야 합니다.