DB/SQL

Oracle DB로 달력 만들기!

세기루민 2021. 4. 12. 22:20
728x90

오늘 과장님께서 주신 과제가 있어서 

과제를 푸는데 과제 내용은 쿼리로 달력을 만드는것! 

그래서 내가 구현한 방법은 총 3가지였다!

#1 Case 문을 이용하는 방법!

select
  min(case when WEEKDAY = 1 then DDAY end) AS 일,
  min(case when WEEKDAY = 2 then DDAY end) AS 월,
  min(case when WEEKDAY = 3 then DDAY end) AS 화,
  min(case when WEEKDAY = 4 then DDAY end) AS 수,
  min(case when WEEKDAY = 5 then DDAY end) AS 목,
  min(case when WEEKDAY = 6 then DDAY end) AS 금,
  min(case when WEEKDAY = 7 then DDAY end) AS 토
from (
  select
    TRUNC(TODAY + LEVEL-1, 'D') as WEEKS,
    TO_CHAR(TODAY + LEVEL-1, 'D') as WEEKDAY,
    LEVEL as DDAY
  from(
    select TO_DATE(&testDay, 'YYYYMM') AS TODAY from DUAL
  ) DUAL
  connect by LEVEL <= TO_CHAR(LAST_DAY(TODAY), 'DD'))
  group by WEEKS
  order by 7;

#2 Decode를 이용하는 방법!

select
  min(decode(WEEKDAY, 1, DDAY)) AS 일,
  min(decode(WEEKDAY, 2, DDAY)) AS 월,
  min(decode(WEEKDAY, 3, DDAY)) AS 화,
  min(decode(WEEKDAY, 4, DDAY)) AS 수,
  min(decode(WEEKDAY, 5, DDAY)) AS 목,
  min(decode(WEEKDAY, 6, DDAY)) AS 금,
  min(decode(WEEKDAY, 7, DDAY)) AS 토
from (
  select
    TRUNC(TODAY + LEVEL-1, 'D') as WEEKS,
    TO_CHAR(TODAY + LEVEL-1, 'D') as WEEKDAY,
    LEVEL as DDAY
  from(
    select TO_DATE(&testDay, 'YYYYMM') AS TODAY from DUAL
  ) DUAL
  connect by LEVEL <= TO_CHAR(LAST_DAY(TODAY), 'DD'))
  group by WEEKS
  order by 7;

Decode는 if else와 동일하다고 생각하면 된다.

#3 PIVOT을 이용하는 방법

select 일, 월, 화, 수, 목, 금, 토 from (
  select
    TRUNC(TODAY + LEVEL-1, 'D') as WEEKS,
    TO_CHAR(TODAY + LEVEL-1, 'D') as WEEKDAY,
    LEVEL as DDAY
  from(
    select TO_DATE(&testDay, 'YYYYMM') AS TODAY from DUAL
  ) DUAL
  connect by LEVEL <= TO_CHAR(LAST_DAY(TODAY), 'DD')
  )
  PIVOT(MAX(DDAY) for WEEKDAY in ('1' as 일, '2' as 월, '3' as 화, '4' as 수, '5' as 목, '6' as 금, '7' as 토))
  order by WEEKS;

 

위와 같이 3가지의 쿼리로 구현할 수 있다.

Last_Day, Trunc, To_Char, Level을 이용하여 구현했는데 

여기서 &testDay는 내가 입력받는 연월이다. 

저기서 'YYYYMM'은 연월을 표현하는 것! 

만약에 연월일을 받고 싶다면 'YYYYMMDD'를 하면 된다.

SQL에서 input처럼 값을 입력받는 방법은 &를 사용하면 된다는 점! 

오늘 공부하면서 많이 배운점은 To_Char이다.

To_Char이 형변환도 되지만 월~일까지 숫자로 표현을 해준다는 것을 알 수 있었다.

 

728x90