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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
with t as (
select 8 as m, 2008 as y from dual
union all select 4 as m, 2001 as y from dual
union all select 12 as m, 2009 as y from dual
),
u as(
select to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd') as fday
, last_day(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd')) as lday
, to_number(to_char(last_day(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd')), 'dd')) as ndays
, m, y
--, case to_number(to_char(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd'), 'D')) when 7 then 0 else
--to_number(to_char(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd'), 'D')) end as wday
, to_number(to_char(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd'), 'D')) - 1as wday
from t)
, tt as (
select rownum as d from dba_objects
where rownum <= 31)
, v as (
select d, mod(wday + d, 7) as col, trunc((wday + d - 1)/ 7) as grp, m, y
from u join tt on d <= ndays
)
, w as (
select y, m, grp, count(*) as jrs
, case grp when 0 then lpad(' ',(7 - count(*)) * 4) end ||
rtrim(RTRIM(REPLACE(REPLACE(XMLAgg(XMLElement("x", case when d <= 9 then ' ' end || to_char(d) ) order by d) , '<x>', ' '), '</x>', ' '), ',')) as ligne
from v
group by y, m, grp
order by y, m, grp)
,x as (
select y,m, -5 as grp, '+----------------------------+' as ligne from t union all
select y,m, -4 as grp,
'|' || lpad(' ', trunc((28 - length(trim(to_char(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd'), 'MONTH'))) - 1 - length(to_char(y)))/2))
|| trim(to_char(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd'), 'MONTH')) || ' ' || to_char(y)
|| lpad(' ', trunc((28 - length(trim(to_char(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd'), 'MONTH'))) - 1 - length(to_char(y)))/2)
+ mod(28 - length(trim(to_char(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd'), 'MONTH'))) - 1 - length(to_char(y)), 2)) || '|' from t union all
select y,m, -3 as grp, '+----------------------------+' as ligne from t union all
select y,m, -1 as grp, '+----------------------------+' as ligne from t union all
select y,m, 10 as grp, '+----------------------------+' as ligne from t union all
select y, m, -2 as grp, '| Su Mo Tu We Th Fr Sa |' as ligne
from t)
, y as (
select 0, grp,y,m, ligne
from x
union all
select length(ligne), grp,y,m, '|' || ligne || lpad(' ', 28 - length(ligne)) || '|' as l
from w
)
select ligne
from y
order by y,m, grp; |
Partager