database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 24848 게시물 읽기
No. 24848
특정기간 동안의 년월을 구하고 싶습니다.
작성자
김인수
작성일
2005-11-14 20:51
조회수
5,981

쉬울거 같으면서도 잘안되네요..

특정기간 '200511' ~ '200610' 동안의

년월을 구하고 싶습니다.

즉 200511

200512

200601

200602

200603

.

.

.

200610

 

이렇게 구하는 방법을 아시는 분은 도와주세요~~~ ^^;;

이 글에 대한 댓글이 총 8건 있습니다.

 

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) B
WHERE RM<=A.COL1

 

3.두 날짜 파라미터중 작은 값에 일련의 ROWNUM 값을 더하면서 두 날짜 사이의 월을 구합니다.

SELECT

TO_CHAR(ADD_MONTHS(TO_DATE('200511','YYYYMM'),RM-1),'YYYYMM')
FROM
(SELECT

MONTHS_BETWEEN(TO_DATE('200610','YYYYMM'),TO_DATE('200511','YYYYMM'))+1 COL1 FROM DUAL) A,
(SELECT ROWNUM RM FROM TEST) B
WHERE RM<=A.COL1

김강환(hashtable)님이 2005-11-14 21:24에 작성한 댓글입니다.
이 댓글은 2005-11-14 21:26에 마지막으로 수정되었습니다.

SELECT     TO_CHAR (ADD_MONTHS (TO_DATE ('200511', 'YYYYMM'), LEVEL - 1),
                    'YYYYMM'
                   ) mon
      FROM DUAL
CONNECT BY ADD_MONTHS (TO_DATE ('200511', 'YYYYMM'), LEVEL - 1) <=
                                                  TO_DATE ('200610', 'YYYYMM')
             
-- SQL 쿼리 질문은 SQL 까페에서... http://cafe.daum.net/oraclesqltuning  

 

장진주(zozogirl)님이 2005-11-14 21:36에 작성한 댓글입니다.

감사합니다.

이렇게 하면 되는군요.. ^^

김인수님이 2005-11-14 21:57에 작성한 댓글입니다. Edit

장진주님 정말 간단하고도 위력적인 쿼리문이네요.

찬탄이 절로 나오는 군요. 좋은 쿼리 보여주셔서 감사합니다.

 

그런데 위 쿼리문이 9i에서는 잘 나오는데 8i에서는 루프에러가 나네요.

8i에서는 어떻게 하면 될까요?

그리고 제 머리로는 저 쿼리가 어떻게 돌아가는지 감을 못잡겠는데 설명해 주시면 정말 감사하겠습니다.

김강환(hashtable)님이 2005-11-14 22:12에 작성한 댓글입니다.

 

장진주님께서 말씀하신 connect by와 같은 구문은 오라클의 특정 버전에만 해당되는 구문입니다.

 

김강환님께서 말씀하신 방법이 8i에서는 효율적일 수 있습니다.

한준희(harbeth)님이 2005-11-15 08:43에 작성한 댓글입니다.

장진주님의 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 DUAL
CONNECT BY ADD_MONTHS (TO_DATE ('200511', 'YYYYMM'), LEVEL - 1) <= TO_DATE ('200610', 'YYYYMM'))

 

김승철(smileman)님이 2005-11-15 09:35에 작성한 댓글입니다.
이 댓글은 2005-11-15 17:48에 마지막으로 수정되었습니다.

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

 

장진주(zozogirl)님이 2005-11-15 11:27에 작성한 댓글입니다.

먼저, 위의 장진주님 쿼리로 하니까 '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가 있어야 합니다.

머깨비님이 2005-11-15 11:50에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
24851Long Type 컬럼의 내용을 다른 Long Type 컬럼으로 UPDATE
오라클
2005-11-15
1948
24850하드파싱 쿼리 잡는 방법없을까요? [1]
파싱
2005-11-15
4505
24849오라클과 XML
김은섭
2005-11-15
1497
24848특정기간 동안의 년월을 구하고 싶습니다. [8]
김인수
2005-11-14
5981
24847ORACLE에도 프로필러가 있는지요??? [1]
김정호
2005-11-14
2180
24846여러개의 테이블 (5개 이상) select 해서 출력하기 [1]
깡댕이
2005-11-14
1908
24845이런 쿼리를 돌이는데 속도가 빨랐다 느렸다 하네요.. [1]
궁금이
2005-11-14
1585
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.052초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다