воскресенье, 19 июля 2009 г.

Календарик одним sql запросом

Помнится, когда я устраивался на работу, мой бывший начальник на собеседовании попросил написать запрос - получить календарь. Насколько помню, я сразу честно сказал - что на данном этапе знания sql - это просто impossible.

Через некоторое время пришлось столкнуться с календариком - и как то я его нарисовал ;). Сегодня полез в пакет и наткнулся на то, что у меня тогда получилось ))



select
mon, tue, wed, thu, fri, sat, sun
from (
select
lv4group,
max(mon) mon,
max(tue) tue,
max(wed) wed,
max(thu) thu,
max(fri) fri,
max(sat) sat,
max(sun) sun
from (
with tr as (
select add_months(sysdate, 0) base from dual
)
, month_days as (
select
mod(lv,7) lv4weekday,
case
when mod(lv, 7) = 0
then lv/7 -1
else floor(lv/7)
end lv4group,
case
when
curd between trunc(base, 'mm')
and last_day(base)
then curd
else null
end mthd
from (
select
level lv,
base,
mind + level - 1 curd
from (
select
base,
trunc(trunc(base, 'mm'), 'd') mind,
trunc(last_day(base), 'd') maxd
from tr
) t
connect by mind + level <= maxd + 7
) t
)
select
lv4group,
decode(lv4weekday, 1, mthd) mon,
decode(lv4weekday, 2, mthd) tue,
decode(lv4weekday, 3, mthd) wed,
decode(lv4weekday, 4, mthd) thu,
decode(lv4weekday, 5, mthd) fri,
decode(lv4weekday, 6, mthd) sat,
decode(lv4weekday, 0, mthd) sun
from month_days
)
group by lv4group
order by lv4group
);

0 коммент.:

Отправить комментарий