본문 바로가기

개발하자/ORACLE

오라클 쿼리문으로 달력출력하기

 

line_characters_in_love-29

 

문제1)달력만들기를 해봅시다!!

SQL>select level cnt,trunc(sysdate,'mm') sday
        from dual
        connect by level<=LAST_DAY(SYSDATE)-trunc(sysdate,'mm')+1;

마지막날짜 2015-02-28일에서 현재날짜에서 달로 TRUNC한 2015-02-01을 뺀 후 1을 더해주면
28일이라는 해당달의 숫자가 나온다.
그 숫자를 connect by level절에 이용하여 일수에 LEVEL 을 붙여준다.
그럼 해당달의 날수를 뽑을 수 있다.
 

 



해당달의 첫날(sday) 2015-02-01에서 CNT숫자(level)를 더해준 후(만약 5일이면 5을 더해줌)
2015-02-06 일에서 다시 1을 빼주면 해당일인 2015-02-05일이 나오고 TO_CHAR로 변환해주었을때
그날이 일요일이면 1을 리턴하므로 DECODE문을 이용하여 to_char(sday+cnt-1,'d') 이것이 1이면 1을 cnt값을 리턴하도록 하면 된다.
일요일만 뽑아보면 다음과 같이 나온다.

SQL>SELECT decode(to_char(sday+cnt-1,'d'),1,cnt) 일
        FROM(select level cnt,trunc(sysdate,'mm') sday
        from dual
        connect by level<=LAST_DAY(SYSDATE)-trunc(sysdate,'mm')+1);

 


위와같이 월~토 까지도 to_char 리턴값을 이용하여 구해준다.

 


이제 공백부분을 없애야 하기에 그룹을 묶어줘야 하는데 해당 날짜를 d형식으로 trunc 해주면
해당주의 첫번째 요일의 일자가 나오므로 그 일자별로 묶어줄수 있게된다. trunc(sday+cnt-1,'d')
그룹의 컬럼별로 MAX값을 얻어오고 7번컬럼 기준으로 order by 하면 완성!!(7번값이 null인 경우는 없음)

SQL>SELECT max(decode(to_char(sday+cnt-1,'d'),1,A.cnt)) 일,
        max(decode(to_char(sday+cnt-1,'d'),2,A.cnt)) 월,
        max(decode(to_char(sday+cnt-1,'d'),3,A.cnt)) 화,
        max(decode(to_char(sday+cnt-1,'d'),4,A.cnt)) 수,
        max(decode(to_char(sday+cnt-1,'d'),5,A.cnt)) 목,
        max(decode(to_char(sday+cnt-1,'d'),6,A.cnt)) 금,
        max(decode(to_char(sday+cnt-1,'d'),7,A.cnt)) 토
FROM (select level cnt,trunc(to_date('15/2/03'),'mm') sday
          from dual
          connect by level<=LAST_DAY(to_date('15/2/03'))-trunc(to_date('15/2/03'),'mm')+1) A
group by trunc(sday+cnt-1,'d')
order by 7;

 2월출력

 
5월출력