http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1010&seq=69&page=1&position=1글쓴이 : 김홍선
년도와 월이 주어졌을 경우, 해당 월의 달력을 생성해주는 쿼리를 만들어 보자.
쿼리는 아래와 같다. (2000년 01월이 주어졌을 경우)
SELECT MIN (DECODE (TO_CHAR (days, 'd'), 1, TO_CHAR (days, 'fmdd'))) 일,
MIN (DECODE (TO_CHAR (days, 'd'), 2, TO_CHAR (days, 'fmdd'))) 월,
MIN (DECODE (TO_CHAR (days, 'd'), 3, TO_CHAR (days, 'fmdd'))) 화,
MIN (DECODE (TO_CHAR (days, 'd'), 4, TO_CHAR (days, 'fmdd'))) 수,
MIN (DECODE (TO_CHAR (days, 'd'), 5, TO_CHAR (days, 'fmdd'))) 목,
MIN (DECODE (TO_CHAR (days, 'd'), 6, TO_CHAR (days, 'fmdd'))) 금,
MIN (DECODE (TO_CHAR (days, 'd'), 7, TO_CHAR (days, 'fmdd'))) 토
FROM (SELECT base_mon + LEVEL - 1 days,
( TRUNC (base_mon + LEVEL - 1, 'd')
- TRUNC (TRUNC (base_mon + LEVEL - 1, 'y'), 'd')
) / 7 + 1 week_grp
FROM (SELECT TO_DATE ('200001', 'yyyymm') base_mon
FROM DUAL)
CONNECT BY base_mon + LEVEL - 1 <= LAST_DAY (base_mon))
GROUP BY week_grp
ORDER BY week_grp
connect by level 절을 사용하지 못하는 버전일 경우에는, 아래와 같이 dict 테이블을 이용한다.
아래 예는 위의 쿼리 와는 다르게 오늘로부터 몇달 후인지를 나타내는 변수 :n에 따라 달력을 생성한다.
(:n=-1 일 경우 지난달, 0은 이번달, 1은 다음달, 2는 다다음달,...)
SELECT MIN (DECODE (TO_CHAR (days, 'd'), 1, TO_CHAR (days, 'fmdd'))) 일,
MIN (DECODE (TO_CHAR (days, 'd'), 2, TO_CHAR (days, 'fmdd'))) 월,
MIN (DECODE (TO_CHAR (days, 'd'), 3, TO_CHAR (days, 'fmdd'))) 화,
MIN (DECODE (TO_CHAR (days, 'd'), 4, TO_CHAR (days, 'fmdd'))) 수,
MIN (DECODE (TO_CHAR (days, 'd'), 5, TO_CHAR (days, 'fmdd'))) 목,
MIN (DECODE (TO_CHAR (days, 'd'), 6, TO_CHAR (days, 'fmdd'))) 금,
MIN (DECODE (TO_CHAR (days, 'd'), 7, TO_CHAR (days, 'fmdd'))) 토
FROM (SELECT base_mon + ROWNUM - 1 days,
( TRUNC (base_mon + ROWNUM - 1, 'd')
- TRUNC (TRUNC (base_mon + ROWNUM - 1, 'y'), 'd')
)
/ 7
+ 1 week_grp
FROM (SELECT TRUNC (ADD_MONTHS (SYSDATE, :n), 'mm') base_mon
FROM DUAL), dict
WHERE base_mon + ROWNUM - 1 <= LAST_DAY (base_mon))
GROUP BY week_grp
ORDER BY week_grp
년도와 월이 주어졌을 경우, 해당 월의 달력을 생성해주는 쿼리를 만들어 보자.
쿼리는 아래와 같다. (2000년 01월이 주어졌을 경우)
SELECT MIN (DECODE (TO_CHAR (days, 'd'), 1, TO_CHAR (days, 'fmdd'))) 일,
MIN (DECODE (TO_CHAR (days, 'd'), 2, TO_CHAR (days, 'fmdd'))) 월,
MIN (DECODE (TO_CHAR (days, 'd'), 3, TO_CHAR (days, 'fmdd'))) 화,
MIN (DECODE (TO_CHAR (days, 'd'), 4, TO_CHAR (days, 'fmdd'))) 수,
MIN (DECODE (TO_CHAR (days, 'd'), 5, TO_CHAR (days, 'fmdd'))) 목,
MIN (DECODE (TO_CHAR (days, 'd'), 6, TO_CHAR (days, 'fmdd'))) 금,
MIN (DECODE (TO_CHAR (days, 'd'), 7, TO_CHAR (days, 'fmdd'))) 토
FROM (SELECT base_mon + LEVEL - 1 days,
( TRUNC (base_mon + LEVEL - 1, 'd')
- TRUNC (TRUNC (base_mon + LEVEL - 1, 'y'), 'd')
) / 7 + 1 week_grp
FROM (SELECT TO_DATE ('200001', 'yyyymm') base_mon
FROM DUAL)
CONNECT BY base_mon + LEVEL - 1 <= LAST_DAY (base_mon))
GROUP BY week_grp
ORDER BY week_grp
connect by level 절을 사용하지 못하는 버전일 경우에는, 아래와 같이 dict 테이블을 이용한다.
아래 예는 위의 쿼리 와는 다르게 오늘로부터 몇달 후인지를 나타내는 변수 :n에 따라 달력을 생성한다.
(:n=-1 일 경우 지난달, 0은 이번달, 1은 다음달, 2는 다다음달,...)
SELECT MIN (DECODE (TO_CHAR (days, 'd'), 1, TO_CHAR (days, 'fmdd'))) 일,
MIN (DECODE (TO_CHAR (days, 'd'), 2, TO_CHAR (days, 'fmdd'))) 월,
MIN (DECODE (TO_CHAR (days, 'd'), 3, TO_CHAR (days, 'fmdd'))) 화,
MIN (DECODE (TO_CHAR (days, 'd'), 4, TO_CHAR (days, 'fmdd'))) 수,
MIN (DECODE (TO_CHAR (days, 'd'), 5, TO_CHAR (days, 'fmdd'))) 목,
MIN (DECODE (TO_CHAR (days, 'd'), 6, TO_CHAR (days, 'fmdd'))) 금,
MIN (DECODE (TO_CHAR (days, 'd'), 7, TO_CHAR (days, 'fmdd'))) 토
FROM (SELECT base_mon + ROWNUM - 1 days,
( TRUNC (base_mon + ROWNUM - 1, 'd')
- TRUNC (TRUNC (base_mon + ROWNUM - 1, 'y'), 'd')
)
/ 7
+ 1 week_grp
FROM (SELECT TRUNC (ADD_MONTHS (SYSDATE, :n), 'mm') base_mon
FROM DUAL), dict
WHERE base_mon + ROWNUM - 1 <= LAST_DAY (base_mon))
GROUP BY week_grp
ORDER BY week_grp
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
94 | 테이블 열항목을 행항목으로 변경하는 팁 | 구퍼 | 2011.01.11 | 8835 |
93 | 오라클 DB 링크 만들기 | 구퍼 | 2011.01.06 | 6826 |
92 | select -> update 구문 샘플 | 구퍼 | 2010.01.21 | 5936 |
91 | Instant Client 사용법 | 구퍼 | 2009.12.30 | 6051 |
90 | Conditions | 구퍼 | 2008.09.17 | 5844 |
89 | Basic Delete Statements | 구퍼 | 2008.09.17 | 4671 |
88 | Basic Update Statements | 구퍼 | 2008.09.17 | 4622 |
87 | Unix, Oracle, Pro*C작성 입찰공고 | 운영자 | 2003.06.05 | 4458 |
86 | Unix, Oracle, Pro*C작성 구인구직게시판 | 운영자 | 2003.06.05 | 4887 |
85 | Unix, Oracle, Pro*C작성 자유게시판 | 운영자 | 2003.06.05 | 4745 |
84 | 최단거리찾기 혹은 멀리 떨어진 두지점간의 거리의 합구하기 | 박상현 | 2006.11.07 | 3690 |
83 | PL/SQL에서 쿼리시 Array Processing 처리방법 | 박상현 | 2006.10.27 | 3622 |
82 | 시간선분(선분이력)의 합집합 구하기 | 박상현 | 2006.06.13 | 5159 |
81 | 최대공약수, 최소공배수 구하기 | 박상현 | 2006.06.13 | 3839 |
80 | 문자열에서 특정 단어 갯수 구하기 | 박상현 | 2006.06.13 | 3573 |
79 | 소수(prime number) 구하기 | 박상현 | 2006.06.13 | 3425 |
» | 달력 생성 쿼리 | 박상현 | 2006.06.13 | 3345 |
77 | 다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법 (2) | 박상현 | 2006.06.13 | 3968 |
76 | 다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법 (1) | 박상현 | 2006.06.13 | 3697 |
75 | 문자열 행으로 분리하기 | 박상현 | 2006.06.13 | 3827 |