Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Допы 2012.docx
Скачиваний:
11
Добавлен:
24.09.2019
Размер:
125.27 Кб
Скачать
  1. Вывести все даты за 2011 год и соответствующие дни недели без использования иерархических запросов и Model.

Select To_Date(Rownum,'DDD')-(Select Add_Months(Trunc(To_date('11.11.2011'),'Y'),12) - Trunc(To_date('11.11.2011'),'Y')

From Dual) Days_Of_Year,

To_Char(To_Date(Rownum,'DDD')-(Select Add_Months(Trunc(To_Date('11.11.2011'),'Y'),12) - Trunc(To_Date('11.11.2011'),'Y')

From Dual),'Day') Day_Of_Week

From (

SELECT *

From (Select 1 C1, 2 C2, 3 C3, 4 C4, 5 C5, 6 C6, 7 C7, 8 C8, 9 C9 from dual)

Group By Cube(1,2,3,4,5,6,7,8,9)

) -- этот подзапрос нужен для вывода столбца длинной свыше 366

--выдает все варианты перебора строк, всего будет 512 вариантов. Нам понадобится только один столбец.

Where Rownum Between 0 And (Select Add_Months(Trunc(To_Date('11.11.2011'),'Y'),12) - Trunc(To_Date('11.11.2011'),'Y')

From Dual); --Возвращает кол-во дней в 2011 году

  1. В произвольной строке, состоящей из символьных элементов, разделенных запятыми, отсортировать элементы по алфавиту. Например, символьную строку

abc,cde,ef,gh,mn,test,ss, df,fw,ewe,wwe

преобразовать к виду:

abc,cde,df,ef,ewe, fw,gh,mn,ss,test,wwe.

With T As

(Select Regexp_Substr('abc,cde,ef,gh,mn,test,ss,df,fw,ewe,wwe', '[^,]+', 1, Level) Str

From Dual

Connect By Instr('abc,cde,ef,gh,mn,test,ss,df,fw,ewe,wwe', ',', 1, Level - 1) > 0

Order By 1) -- разбиваем нашу строку на подстроки, разделенные запятыми и сортируем по алфавиту

Select 'abc,cde,ef,gh,mn,test,ss,df,fw,ewe,wwe' Исходник, Max(Ltrim(Sys_Connect_By_Path(Str, ','), ',')) Результат

From (Select T.Str,Rownum Rn

From T)

Start With Rn=1

Connect By Prior Rn+1=Rn; -- пронумеруем каждую строчку и произведем сборка столбика в строчку (функция Sys_Connect_By_Path(Str, ','))

  1. Определить временной интервал между заданной и текущей датами. Результат вывести в виде: ## лет ## мес ## дней, где # обозначает цифру.

SELECT CASE

WHEN TO_DATE(sysdate,'dd.mm.yy') >= TO_DATE('&&x', 'dd.mm.yy') THEN (

TRUNC(MONTHS_BETWEEN(sysdate, TO_DATE('&x', 'dd.mm.yy'))/12)|| ' лет '||

TRUNC(MOD(MONTHS_BETWEEN(sysdate, TO_DATE('&x', 'dd.mm.yy')), 12))|| ' месяцев '||

CASE

WHEN SUBSTR(TO_DATE(sysdate,'dd.mm.yy'), 0, 2) < SUBSTR(TO_DATE('&x', 'dd.mm.yy'), 0, 2)

THEN SUBSTR(LAST_DAY(ADD_MONTHS('&x', TRUNC(MONTHS_BETWEEN(sysdate, TO_DATE('&x', 'dd.mm.yy'))))), 0, 2) - SUBSTR(to_date('&x', 'dd.mm.yy'), 0, 2) + substr(to_date(sysdate,'dd.mm.yy'), 0, 2)

WHEN SUBSTR(TO_DATE(sysdate,'dd.mm.yy'), 0, 2) >= SUBSTR(TO_DATE('&x', 'dd.mm.yy'), 0, 2)

THEN SUBSTR(TO_DATE(sysdate,'dd.mm.yy'), 0, 2) - SUBSTR(TO_DATE('&x', 'dd.mm.yy'), 0, 2)

END || ' дней' )

WHEN TO_DATE(sysdate,'dd.mm.yy') < TO_DATE('&x', 'dd.mm.yy') THEN (

TRUNC(MONTHS_BETWEEN(to_date('&x', 'dd.mm.yy'),sysdate)/12)|| ' лет '||

TRUNC(MOD(MONTHS_BETWEEN(to_date('&x', 'dd.mm.yy'),sysdate ), 12))|| ' месяцев '||

CASE

WHEN SUBSTR(TO_DATE(sysdate,'dd.mm.yy'), 0, 2) < SUBSTR(TO_DATE('&x', 'dd.mm.yy'), 0, 2)

THEN SUBSTR(TO_DATE('&x', 'dd.mm.yy'), 0, 2) - SUBSTR(TO_DATE(sysdate,'dd.mm.yy'), 0, 2)

WHEN SUBSTR(TO_DATE(sysdate,'dd.mm.yy'), 0, 2) > SUBSTR(TO_DATE('&x', 'dd.mm.yy'), 0, 2)

THEN SUBSTR(LAST_DAY(ADD_MONTHS(sysdate, TRUNC(MONTHS_BETWEEN(to_date('&x', 'dd.mm.yy'),sysdate)))), 0, 2) - SUBSTR(TO_DATE(sysdate,'dd.mm.yy'), 0, 2) + SUBSTR(TO_DATE('&x', 'dd.mm.yy'), 0, 2)

END || ' дней' )

END "RESULT"

FROM dual;

UNDEFINE x