달력생성쿼리의 새버전을 공개합니다. 7 22 9,479

by 손님 달력 [2008.11.24 09:18:46]


제 홈페이지와 아래 사이트들에서 포스팅 해놓은 내용을 확인하실 수 있습니다.
http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1010&seq=69#3398
http://www.orafaq.com/forum/t/94953/78939/
http://www.orafaq.com/node/2029


쏘쿨 - www.soqool.com

with t as (
select to_date('200811','yyyymm') ym from dual)
SELECT * FROM (
SELECT MIN (DECODE (TO_CHAR (YM + LEVEL - 1, 'd'), '1', LEVEL)) SUN
  , MIN (DECODE (TO_CHAR (YM + LEVEL - 1, 'd'), '2', LEVEL)) MON
  , MIN (DECODE (TO_CHAR (YM + LEVEL - 1, 'd'), '3', LEVEL)) TUE
  , MIN (DECODE (TO_CHAR (YM + LEVEL - 1, 'd'), '4', LEVEL)) WED
  , MIN (DECODE (TO_CHAR (YM + LEVEL - 1, 'd'), '5', LEVEL)) THU
  , MIN (DECODE (TO_CHAR (YM + LEVEL - 1, 'd'), '6', LEVEL)) FRI
  , MIN (DECODE (TO_CHAR (YM + LEVEL - 1, 'd'), '7', LEVEL)) SAT
   FROM T
CONNECT BY LEVEL <= LAST_DAY (YM) - YM + 1
  GROUP BY TRUNC (YM + LEVEL, 'iw')
  ORDER BY 7)




쿼리 결과:


   SUN MON TUE WED THU FRI SAT
---------- ---------- ---------- ---------- ---------- ---------- ----------
   1
2   3   4   5   6   7   8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

by 지나가던길 [2008.11.25 17:14:35]
정말 멋지네요.
퍼갑니다.

by 보태미 [2008.11.26 14:03:43]
이런 좋은 방법이 있었군요. 좋은 정보 감사합니다.

by 별이지롱 [2008.11.26 14:19:02]
좋은 정보 감사합니다,

by 왕희복 [2008.11.28 09:25:01]
심플하게 잘 하셨네요 ^^ 잘 퍼갑니다.

by 라선오 [2008.12.01 10:25:04]
좋은 정보 감사합니다.(2)

by 취중넝담 [2008.12.04 20:30:06]
멋지네요..펌~~

by santaclaus [2008.12.05 13:51:12]
그 유명하신 김홍선씨가 여기를 들르셨군요^^

by 비창 [2008.12.05 18:55:56]
맞네요. 쏘쿨;

by Ejql [2008.12.10 10:06:51]
따라가려면 한참 멀었다는것을 느끼게되는 쿼리 한개였습니다.
분석하는데만도 몇십분이 걸리던걸요. ㅡㅡ;
(YM + LEVEL, 'iw')의 의미를 아는데 힘이 들었습니다.
공부도하고 좋은 쿼리도 이렇게 공개적으로 알려주시니 정말 감사합니다.


by 쭌이 [2008.12.10 10:26:36]
완전최공~>_<

by 쏘쿨 [2008.12.10 10:54:04]
이 쿼리는 기존에 나온 달력쿼리에 비해서 상당히 간결할 겁니다.
하지만, 사용하는데 문제는 없지만, 딱 한가지 오류가 있습니다.
과연 무엇일까요?

by 엉쿰돌이 [2008.12.19 14:30:52]
대단하심...

by madcat [2008.12.19 14:59:05]
오류는 없어보이는데...-_-a
혹시 date format 관련해서...
다른 항목은 제 날짜를 기준으로 처리하고 있는데 비해서,
trunc(ym+level, 'iw') 항목을 하루 뒤로 해서 group by 하는 것을 말씀하시는 건가요?
해당부분을 조회해보니 월요일을 기준으로 trunc되더군요.

by 쏘쿨 [2008.12.19 15:11:58]
trunc는 제대로 되고 있는 겁니다.
사실 제가 말하려고 하는 오류는 중요한 건 아닙니다.
아주 오래전 과거 날짜를 조회하지 않는 이상요.

by 피터 [2008.12.19 17:39:51]
문제점이라는게 1582년10월을 조회했을때 1,2,3,4,15,16,17 이 아니고 1,2,3,4,5,6,7로 나오는 것을 말씀하시는 건가 보네요.
쏘쿨사이트에서 저 날짜에 대한 내용을 본 적이 있네요.

by 쏘쿨 [2008.12.19 18:12:38]
네, 바로 그겁니다.

by madcat [2008.12.19 19:14:14]
날짜부분에 LEVEL 대신에 TO_CHAR (YM + LEVEL - 1, 'fmdd') 를 써야 맞는다는 말씀이시네요. 역사를 제대로 알아야 쿼리도 제대로 나오는군요.^^a

by 유찬호 [2008.12.22 14:50:20]
** 이건 예날꺼 인가요 ?

SELECT MAX(DECODE(DD_W,1,DD)) SUN_DAY
, MAX(DECODE(DD_W,2,DD)) MON_DAY
, MAX(DECODE(DD_W,3,DD)) TUE_DAY
, MAX(DECODE(DD_W,4,DD)) WED_DAY
, MAX(DECODE(DD_W,5,DD)) THU_DAY
, MAX(DECODE(DD_W,6,DD)) FRI_DAY
, MAX(DECODE(DD_W,7,DD)) SAT_DAY
FROM ( SELECT ROWNUM DD
, TO_CHAR(TO_DATE(:YYYYMM||LPAD(ROWNUM,2,'00')),'D') DD_W
, TO_CHAR(TO_DATE(:YYYYMM||LPAD(ROWNUM,2,'00'))+1,'IW') DD_IW
FROM DUAL
CONNECT BY LEVEL <= TO_CHAR(LAST_DAY(TO_DATE('200811','YYYYMM')),'DD')
)
GROUP BY DD_IW
ORDER BY 1 NULLS FIRST

by 장현수 [2009.03.18 17:21:26]
좋은 정보 정말 감사합니다. *^_^*

by 쫑구 [2009.08.04 15:31:35]
위에꺼 참고로 해서 제가 한번 쫘봤는데용
짠다고 짠게 결국 보니깐 거의 똑같고 수정 비슷하게 되었네용
근데...위 쿼리에서 오류로 나온다는 1582년 10월도 제대로 나옵니당
개선되었다고 볼수 있는거졍...
아래 쿼리 붙이겠습니당~

with t as(
select to_date('158210','yyyymm') ym from dual)
select SUN,MON,TUE,WED,THU,FRI,SAT from (
select
ceil((to_char(ym,'d')+level-1)/7) rn,
max(decode(to_char(ym+level-1,'d'),1,level)) SUN,
max(decode(to_char(ym+level-1,'d'),2,level)) MON,
max(decode(to_char(ym+level-1,'d'),3,level)) TUE,
max(decode(to_char(ym+level-1,'d'),4,level)) WED,
max(decode(to_char(ym+level-1,'d'),5,level)) THU,
max(decode(to_char(ym+level-1,'d'),6,level)) FRI,
max(decode(to_char(ym+level-1,'d'),7,level)) SAT
from t
connect by level<to_char(last_day(ym),'dd')+1
group by ceil((to_char(ym,'d')+level-1)/7)
order by rn
)tt

by 아수라 [2009.08.18 13:30:09]
저에 얕은 지식을 느끼게 해주는 쿼리네요 ^^
좋은거 분석 하고 갑니다.

by 남자 [2009.12.28 10:53:59]
WITH T AS (
SELECT TO_DATE('200912','YYYYMM') YM FROM DUAL)
SELECT * FROM (
SELECT MAX (DECODE (TO_CHAR (YM + ROWNUM - 1, 'D'), '1', ROWNUM)) SUN
, MAX (DECODE (TO_CHAR (YM + ROWNUM - 1, 'D'), '2', ROWNUM)) MON
, MAX (DECODE (TO_CHAR (YM + ROWNUM - 1, 'D'), '3', ROWNUM)) TUE
, MAX (DECODE (TO_CHAR (YM + ROWNUM - 1, 'D'), '4', ROWNUM)) WED
, MAX (DECODE (TO_CHAR (YM + ROWNUM - 1, 'D'), '5', ROWNUM)) THU
, MAX (DECODE (TO_CHAR (YM + ROWNUM - 1, 'D'), '6', ROWNUM)) FRI
, MAX (DECODE (TO_CHAR (YM + ROWNUM - 1, 'D'), '7', ROWNUM)) SAT
FROM T
CONNECT BY ROWNUM <= LAST_DAY (YM) - YM + 1
GROUP BY TO_CHAR(YM + ROWNUM, 'IW')
ORDER BY 7
)

이것도 같은결과 맞는거져?
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입