select * from ( select to_char(dt + level - 1,'yyyymmdd') dt , ceil(level / 7)||'주차' "주차" , to_char(dt + level - 1,'d') dy from (select case when to_char(to_date(:in_dt, 'yyyymmdd'),'d') in ('1','7') then to_date(:in_dt, 'yyyymmdd') else trunc(to_date(:in_dt, 'yyyymmdd'),'d') end dt from dual) where to_char(dt + level - 1,'d') not in ('1','7') connect by level <= case when to_char(last_day(to_date(:in_dt, 'yyyymmdd')),'d') in ('1','7') then last_day(to_date(:in_dt, 'yyyymmdd')) else next_day(last_day(to_date(:in_dt, 'yyyymmdd')),6) end - dt + 1 ) pivot (min(dt) for dy in (2 "월", 3 "화", 4 "수", 5 "목", 6 "금")) order by "주차"
SELECT LEVEL w , TO_CHAR(s + LEVEL * 7 - 7, 'yyyymmdd') mon , TO_CHAR(s + LEVEL * 7 - 6, 'yyyymmdd') tue , TO_CHAR(s + LEVEL * 7 - 5, 'yyyymmdd') wed , TO_CHAR(s + LEVEL * 7 - 4, 'yyyymmdd') thu , TO_CHAR(s + LEVEL * 7 - 3, 'yyyymmdd') fri FROM (SELECT TRUNC(TRUNC(dt, 'mm') + 2, 'iw') s , TRUNC(LAST_DAY(dt), 'iw') e FROM (SELECT TO_DATE('20170601', 'yyyymmdd') dt FROM dual) ) CONNECT BY LEVEL <= (e - s) / 7 + 1 ;