powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Дни отпуска
156 сообщений из 156, показаны все 7 страниц
Дни отпуска
    #39448750
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Имеется длинная динамическая функция, которая проходит по таблице График. В этой таблице есть столбцы год, код сотрудника и 52 столбца, которые подразумевают собой недели. В данной функции есть возможность преобразования названия столбцов с даты (число и месяц начала недели). То есть неделя N2, N3 в 2017 году представлены как "2 янв, 9 янв". Также значения столбцов представляют собой буквы "у", по которым функция, динамически прогоняясь по столцам, вытаскивает те, чьи значения равны этому "у".
Однако есть недочёт, ибо нужно показывать первое и последнее число отпуска. С первым числом понятно - это начало недели, а вот последнее - это именно последний день последней недели отпуска. Грубо говоря, если у меня стоит буковка с неделях 2 января, 9 января, и это интервал отпуска, то нужно показать именно 2 января, 15 января (то есть начало и конец отпуска). Что нужно изменить в данной функции? Я пытался поменять там дату, приплюсовать 7, но тогда он плюсует всё. И первую неделю и вторую.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace FUNCTION get_week_list3(i_code IN INTEGER, i_year in integer) RETURN VARCHAR2 IS
  l_list  VARCHAR2(32767);
  l_res   VARCHAR2(4000);
BEGIN
SELECT listagg('CASE WHEN '||column_name||' IN(''у'') THEN '||''''|| to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd mon')||''''|| '||''; '' ELSE NULL END ' ,'||') 
WITHIN GROUP(ORDER BY 1)
  INTO  l_list
  FROM  user_tab_columns
  WHERE TABLE_NAME = 'GRAFIK' 
  AND column_name LIKE 'N%';
EXECUTE IMMEDIATE 'SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year' INTO l_res USING i_code,i_year;
RETURN RTRIM(l_res);
END;



Вот вызов
Код: plsql
1.
2.
3.
SELECT t.god, u.FIO, (regexp_substr ( get_week_list3(t.kod_sotr,t.god), '[^;]*;') || 
regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')) as учебный_отпуск FROM GRAFIK t, USERS u 
where t.KOD_SOTR = u.KOD_SOTR;
...
Рейтинг: 0 / 0
Дни отпуска
    #39448765
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

шо опять

1) в году не один отпуск
2) отпуск с с декабря по январь

на таких данных ваш вызов неправильно пашет
Код: plsql
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.
SQL> select * from grafik;

       GOD   KOD_SOTR N N N N N N N N N N
---------- ---------- - - - - - - - - - -
      2017        222 у   o o у o у o   o
      2017        202   у o o у o у o   o
      2017        111 o   у у у   у   o

SQL> SELECT t.god, (regexp_substr ( get_week_list3(t.kod_sotr,t.god), '[^;]*;') ||
  2  regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')) as f
  3  FROM GRAFIK t
  4  /

       GOD F
---------- ----------------------------------------
      2017 01 січ; 12 лют;
      2017 08 січ; 12 лют;
      2017 15 січ; 12 лют;

SQL> desc grafik;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 GOD                                                NUMBER(38)
 KOD_SOTR                                           NUMBER(38)
 N1                                                 VARCHAR2(1)
 N2                                                 VARCHAR2(1)
 N3                                                 VARCHAR2(1)
 N4                                                 VARCHAR2(1)
 N5                                                 VARCHAR2(1)
 N6                                                 VARCHAR2(1)
 N7                                                 VARCHAR2(1)
 N8                                                 VARCHAR2(1)
 N9                                                 VARCHAR2(1)
 N10                                                VARCHAR2(1)



зы
1) недель не 52
2) нет order by

......
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39448773
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

А как должно быть правильно? Это надо вызов функции переправлять?
...
Рейтинг: 0 / 0
Дни отпуска
    #39448776
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..Norman94,

шо опять


......
stax

прям с языка снял
...
Рейтинг: 0 / 0
Дни отпуска
    #39448778
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax

И очень странно, что у вас неправильно выводит. У меня так.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create or replace FUNCTION get_week_list3(i_code IN INTEGER, i_year in integer) RETURN VARCHAR2 IS
  l_list  VARCHAR2(32767);
  l_res   VARCHAR2(4000);
BEGIN
SELECT listagg('CASE WHEN '||column_name||' IN(''у'') THEN '||''''||to_char( greatest( trunc (to_date(i_year||'0101', 'yyyymmdd')+((LTRIM(column_name,'N'))-1)*7, 'iw')
,to_date(i_year||'0101', 'yyyymmdd')) ,'dd mon')||''''|| '||''; '' ELSE NULL END ' ,'||')
WITHIN GROUP(ORDER BY 1)
  INTO  l_list
  FROM  user_tab_columns
  WHERE TABLE_NAME = 'GRAFIK' 
  AND column_name LIKE 'N%';
EXECUTE IMMEDIATE 'SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year' INTO l_res USING i_code,i_year;
RETURN RTRIM(l_res);
END;

SELECT t.god, u.FIO, (regexp_substr ( get_week_list3(t.kod_sotr,t.god), '[^;]*;') ||
regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')) as учебный_отпуск FROM GRAFIK t, USERS u 
where t.KOD_SOTR = u.KOD_SOTR;



И вывод на картинке.

У расставлены у 1-5 недель
...
Рейтинг: 0 / 0
Дни отпуска
    #39448779
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax

И очень странно, что у вас неправильно выводит. У меня так.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create or replace FUNCTION get_week_list3(i_code IN INTEGER, i_year in integer) RETURN VARCHAR2 IS
  l_list  VARCHAR2(32767);
  l_res   VARCHAR2(4000);
BEGIN
SELECT listagg('CASE WHEN '||column_name||' IN(''у'') THEN '||''''||to_char( greatest( trunc (to_date(i_year||'0101', 'yyyymmdd')+((LTRIM(column_name,'N'))-1)*7, 'iw')
,to_date(i_year||'0101', 'yyyymmdd')) ,'dd mon')||''''|| '||''; '' ELSE NULL END ' ,'||')
WITHIN GROUP(ORDER BY 1)
  INTO  l_list
  FROM  user_tab_columns
  WHERE TABLE_NAME = 'GRAFIK' 
  AND column_name LIKE 'N%';
EXECUTE IMMEDIATE 'SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year' INTO l_res USING i_code,i_year;
RETURN RTRIM(l_res);
END;

SELECT t.god, u.FIO, (regexp_substr ( get_week_list3(t.kod_sotr,t.god), '[^;]*;') ||
regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')) as учебный_отпуск FROM GRAFIK t, USERS u 
where t.KOD_SOTR = u.KOD_SOTR;



И вывод на картинке.

У расставлены у 1-5 недель
...
Рейтинг: 0 / 0
Дни отпуска
    #39448785
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..,

А как должно быть правильно? Это надо вызов функции переправлять?
я не знаю, могу только догадыватся
если отпусков несколько, напр 3 отпуска то что надо?

......
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39448794
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..Norman94stax..,

А как должно быть правильно? Это надо вызов функции переправлять?
я не знаю, могу только догадыватся
если отпусков несколько, напр 3 отпуска то что надо?

......
stax

А если где-то отгул взял то вообще молодец будет ....

А если одна неделя отпуска?
...
Рейтинг: 0 / 0
Дни отпуска
    #39448796
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Нет нет, учебный отпуск один. Интервал его обозначается неделями, то бишь N1, N2, N3 и т.д. Они преобразованы в даты, то есть число и месяц начала недели. Как бы круто, но есть изъян - интервал отпуска это 1 и последняя дата, а 1 дата - это начало недели, а последний - это конец, то есть воскресенье последней помеченной "у" недели. И я не знаю как это реализовать.
...
Рейтинг: 0 / 0
Дни отпуска
    #39448798
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Для отгула есть отдельная функция.

А если одна неделя, то её начало и её конец.
...
Рейтинг: 0 / 0
Дни отпуска
    #39448803
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax
И очень странно, что у вас неправильно выводит. У меня так.

у сотрудника 111 в 2017 году два отпуска
Код: plsql
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.
SQL> select * from grafik;

       GOD   KOD_SOTR N N N N N N N N N N
---------- ---------- - - - - - - - - - -
      2017        222 у   o o у o у o   o
      2017        202   у o o у o у o   o
      2017        111 o   у у у   у   o
SQL> SELECT t.god, kod_sotr, get_week_list3(t.kod_sotr,t.god) f from grafik t;

       GOD   KOD_SOTR F
---------- ---------- ----------------------------------------
      2017        222 01 січ; 29 січ; 12 лют;
      2017        202 08 січ; 29 січ; 12 лют;
      2017        111 15 січ; 22 січ; 29 січ; 12 лют;


SQL> SELECT t.god, (regexp_substr ( get_week_list3(t.kod_sotr,t.god), '[^;]*;') ||
  2  regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')) as f
  3  FROM GRAFIK t
  4  /

       GOD F
---------- ----------------------------------------
      2017 01 січ; 12 лют;
      2017 08 січ; 12 лют;
      2017 15 січ; 12 лют;



Ваш вызов говорит о другом

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39448808
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

В отпуск только с понедельника(воскреснья) ?
...
Рейтинг: 0 / 0
Дни отпуска
    #39448813
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Странно. Причём у вас он по воскресениям ищет. В любом случае подскажите как решить мою проблему?
...
Рейтинг: 0 / 0
Дни отпуска
    #39448814
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123йй,

Да, только с понедельника. А заканчиваться должен в воскресенье.
...
Рейтинг: 0 / 0
Дни отпуска
    #39448823
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,
если отпуск токо один то два варианта
1) менять ф-цию
2) менять вызов

если 2 то примерно так
1) regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$') в дату
2) +7 дней
3) least
4) опять в DD MON

......
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39448831
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Попытался так сделать, неверно.
Код: sql
1.
2.
3.
SELECT t.god, u.FIO, (regexp_substr ( get_week_list3(t.kod_sotr,t.god), '[^;]*;') || 
to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')+7), 'dd.mon')) as учебный_отпуск FROM GRAFIK t, USERS u 
where t.KOD_SOTR = u.KOD_SOTR;


И я не могу понять куда Least вставлять
...
Рейтинг: 0 / 0
Дни отпуска
    #39448835
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..,

Попытался так сделать, неверно.
Код: sql
1.
2.
3.
SELECT t.god, u.FIO, (regexp_substr ( get_week_list3(t.kod_sotr,t.god), '[^;]*;') || 
to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')+7), 'dd.mon')) as учебный_отпуск FROM GRAFIK t, USERS u 
where t.KOD_SOTR = u.KOD_SOTR;


И я не могу понять куда Least вставлять

тогда не там +7 ставишь to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')), 'dd.mon')+7,'dd.mon')
...
Рейтинг: 0 / 0
Дни отпуска
    #39448837
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

и на конец года проверить надо
...
Рейтинг: 0 / 0
Дни отпуска
    #39448844
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Код: sql
1.
to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')), 'dd.mon')+7,'dd.mon')



Он на позицию , +7 ругается
...
Рейтинг: 0 / 0
Дни отпуска
    #39448851
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94MaximaXXL,

Код: sql
1.
to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')), 'dd.mon')+7,'dd.mon')



Он на позицию , +7 ругается

попробуй + interval '7' day
...
Рейтинг: 0 / 0
Дни отпуска
    #39448857
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXLNorman94MaximaXXL,

Код: sql
1.
to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')), 'dd.mon')+7,'dd.mon')




Он на позицию , +7 ругается

попробуй + interval '7' day

to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')), 'dd.mon')+ interval '7' day)

Ошибка: invalid data type for datatime
...
Рейтинг: 0 / 0
Дни отпуска
    #39448874
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94
to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')), 'dd.mon')+ interval '7' day)

Ошибка: invalid data type for datatime

может тогда правильно писать будем?
Код: plsql
1.
to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')), 'dd.mon')+ interval '7' day,'dd.mon')
...
Рейтинг: 0 / 0
Дни отпуска
    #39448895
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Пробовал, он ругается на запятую
...
Рейтинг: 0 / 0
Дни отпуска
    #39448909
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94MaximaXXL,

Код: sql
1.
to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')), 'dd.mon')+7,'dd.mon')



Он на позицию , +7 ругается
4 скобки открыли, 5 закрыли... но при этом без "+7" оно работало. Шайтаны просто :D
...
Рейтинг: 0 / 0
Дни отпуска
    #39448913
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
j2k,

Да нет, всё правильно. И при этом он зачем то скобку требует.
Код: plsql
1.
2.
3.
SELECT t.god, u.FIO, (regexp_substr ( get_week_list3(t.kod_sotr,2017), '[^;]*;') ||' - '||
to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')), 'dd.mon')+ interval '7' day,'dd.mon') as учебный_отпуск FROM GRAFIK t, USERS u 
where u.kod_sotr = 109909 and t.kod_sotr = u.KOD_SOTR and t.god = 2017;
...
Рейтинг: 0 / 0
Дни отпуска
    #39448919
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтож раз с вызовом не получается, то как быть с изменением функцией? Вот он ищет отпуска по литре б. Даже если их 1-2-3 отпуска, не важно. Принцип такой же, так же переименовывает даты. Вызов стандартный, там даже менять нечего. Поэтому такой вопрос: если менять дату в функции, то как? Я пытался поставить +7, но он тогда ВСЕ даты прибавляет на семь, а надо последний интервал.
Код: sql
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.
create or replace FUNCTION
 week_fun2(i_code IN INTEGER, i_year in integer)
RETURN VARCHAR2 IS
l_list VARCHAR2(32767);
 l_res VARCHAR2(4000);
 BEGIN SELECT listagg(column_name,',') WITHIN GROUP(ORDER BY to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd.mon'))
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';
   l_list:='with t2 as(
  select God, Kod_sotr,'||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year)'||
  q'~
 select /* God, Kod_sotr, */ listagg(lag_WN) within group (order by RN,Kod_sotr) vacation
  from (
  select rownum RN, God, Kod_sotr,
  case when lead(Week_Number) over(PARTITION by God order by Kod_sotr) - Week_number > 1 then /*Weeks*/Weeks_D||';'
      when lead(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||';'
       when lag(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||','
       when Week_number - lag(Week_Number) over(PARTITION by God order by Kod_sotr) > 1 then  /*Weeks*/Weeks_D||','
       else null end lag_WN
          from (
                   select God, Kod_sotr, /*weeks*/
to_char(trunc(to_date(god,'yyyy'),'y')+(cast(ltrim(weeks,'N') as number)-1)*7,'dd mon') Weeks_D, 
                   Vacation, cast(ltrim(weeks,'N')as number) Week_Number from t2
                  unpivot (vacation for weeks in (~'||l_list||q'~))
                 order by God, Kod_sotr, cast(ltrim(weeks,'N')as number)
                )where vacation='о'
          )group by god, Kod_sotr~';
   EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
  RETURN RTRIM(l_res);
  END;


SELECT t.god, u.FIO,  week_fun10(t.kod_sotr,t.god) as внеочередной FROM GRAFIK t, USERS u 
where t.KOD_SOTR = u.KOD_SOTR;



Как здесь быть, скажите пожалуйста?
...
Рейтинг: 0 / 0
Дни отпуска
    #39448922
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94j2k,

Да нет, всё правильно. И при этом он зачем то скобку требует.
Код: plsql
1.
2.
3.
SELECT t.god, u.FIO, (regexp_substr ( get_week_list3(t.kod_sotr,2017), '[^;]*;') ||' - '||
to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')), 'dd.mon')+ interval '7' day,'dd.mon') as учебный_отпуск FROM GRAFIK t, USERS u 
where u.kod_sotr = 109909 and t.kod_sotr = u.KOD_SOTR and t.god = 2017;


ох, давайте по кускам:
1)
Код: plsql
1.
 ( 

- начало вашего столбца
2)
Код: plsql
1.
regexp_substr ( get_week_list3(t.kod_sotr,2017), '[^;]*;') 

- две открыли, две закрыли (т.е. тут у вас какая-то строка)
3)
Код: plsql
1.
||' - '|| 

- добавили еще строку
4)
Код: plsql
1.
to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')), 'dd.mon')

- 4 открыли, 4 закрыли (получили СТРОКУ)
5)
Код: plsql
1.
+ interval '7' day 

к СТРОКЕ добавляете интервал
6)
Код: plsql
1.
,'dd.mon') 

- закрываете первую скобку с непонятным синтаксисом
Стало яснее?
...
Рейтинг: 0 / 0
Дни отпуска
    #39448925
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94j2k,

Да нет, всё правильно. И при этом он зачем то скобку требует.
Код: plsql
1.
2.
3.
SELECT t.god, u.FIO, (regexp_substr ( get_week_list3(t.kod_sotr,2017), '[^;]*;') ||' - '||
to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$')), 'dd.mon')+ interval '7' day,'dd.mon') as учебный_отпуск FROM GRAFIK t, USERS u 
where u.kod_sotr = 109909 and t.kod_sotr = u.KOD_SOTR and t.god = 2017;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  1  SELECT t.god, (regexp_substr ( get_week_list3(t.kod_sotr,t.god), '[^;]*;') ||
  2  to_char((to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$'),'DD.MON";"')+7),'dd.mon";"')) as f
  3* FROM GRAFIK t
SQL> /

       GOD F
---------- ----------------------------------------
      2017 01 січ;19.лют;
      2017 08 січ;19.лют;
      2017 15 січ;19.лют;


ps
добавить least

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39448926
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

нет под рукой базы - пишу на форуме
попробуй так:
Код: plsql
1.
2.
3.
SELECT t.god, u.FIO, regexp_substr ( get_week_list3(t.kod_sotr,2017), '[^;]*;') ||' - '||
to_char(to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$'), 'dd.mon')+ interval '7' day,'dd.mon') as учебный_отпуск FROM GRAFIK t, USERS u 
where u.kod_sotr = 109909 and t.kod_sotr = u.KOD_SOTR and t.god = 2017;
...
Рейтинг: 0 / 0
Дни отпуска
    #39448928
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Без толку. Теперь он пишет

date format picture ends before converting entire input string
...
Рейтинг: 0 / 0
Дни отпуска
    #39448931
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Код: sql
1.
2.
3.
SELECT t.god, u.FIO, regexp_substr ( get_week_list3(t.kod_sotr,2017), '[^;]*;') ||' - '||
to_char((to_date(regexp_substr ( get_week_list3(t.kod_sotr,t.god), ' [^;]*;$'),'DD MON";"')+6),'dd mon";"') as учебный_отпуск FROM GRAFIK t, USERS u 
where u.kod_sotr = 109909 and t.kod_sotr = u.KOD_SOTR and t.god = 2017;


Во, спасибо Вам. И вам MaximaXXL

Теперь же мне как то нужно совместить это с той функцией, что я бросил выше. Куда здесь это можно подставить?
Код: sql
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.
create or replace FUNCTION
 week_fun2(i_code IN INTEGER, i_year in integer)
RETURN VARCHAR2 IS
l_list VARCHAR2(32767);
 l_res VARCHAR2(4000);
 BEGIN SELECT listagg(column_name,',') WITHIN GROUP(ORDER BY to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd.mon'))
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';
   l_list:='with t2 as(
  select God, Kod_sotr,'||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year)'||
  q'~
 select /* God, Kod_sotr, */ listagg(lag_WN) within group (order by RN,Kod_sotr) vacation
  from (
  select rownum RN, God, Kod_sotr,
  case when lead(Week_Number) over(PARTITION by God order by Kod_sotr) - Week_number > 1 then /*Weeks*/Weeks_D||';'
      when lead(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||';'
       when lag(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||','
       when Week_number - lag(Week_Number) over(PARTITION by God order by Kod_sotr) > 1 then  /*Weeks*/Weeks_D||','
       else null end lag_WN
          from (
                   select God, Kod_sotr, /*weeks*/
to_char(trunc(to_date(god,'yyyy'),'y')+(cast(ltrim(weeks,'N') as number)-1)*7,'dd mon') Weeks_D, 
                   Vacation, cast(ltrim(weeks,'N')as number) Week_Number from t2
                  unpivot (vacation for weeks in (~'||l_list||q'~))
                 order by God, Kod_sotr, cast(ltrim(weeks,'N')as number)
                )where vacation='о'
          )group by god, Kod_sotr~';
   EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
  RETURN RTRIM(l_res);
  END;


SELECT t.god, u.FIO,  week_fun10(t.kod_sotr,t.god) as внеочередной FROM GRAFIK t, USERS u 
where t.KOD_SOTR = u.KOD_SOTR;
...
Рейтинг: 0 / 0
Дни отпуска
    #39448933
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

я ж Вам кинул "работающий" вариант


.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39448937
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..,

[src sql]
Во, спасибо Вам. И вам MaximaXXL

Теперь же мне как то нужно совместить это с той функцией, что я бросил выше. Куда здесь это можно подставить?

імхо
проще переписать ф-цию, выбросив динамику

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39448939
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

ну тот работающий вариант работает для вызова тех одиночных интервалов. А вызов у другой функции, который ловит интервалы, там не привяжешь. Или я что то упускаю?
...
Рейтинг: 0 / 0
Дни отпуска
    #39448942
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..,

ну тот работающий вариант работает для вызова тех одиночных интервалов. А вызов у другой функции, который ловит интервалы, там не привяжешь. Или я что то упускаю?
упускаете
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
  1* SELECT t.god, kod_sotr,  week_fun2(t.kod_sotr,t.god) as f FROM GRAFIK t
SQL> /

       GOD   KOD_SOTR F
---------- ---------- ----------------------------------------
      2017        222 15 січ,22 січ;05 лют;19 лют;05 бер;
      2017        202 15 січ,22 січ;05 лют;19 лют;05 бер;
      2017        111 01 січ;26 лют;



гляньте если интервал одна неделя, что менять будете?

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39448943
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Norman94,

SELECT t.god, u.FIO, to_char((to_date(regexp_substr (week_fun2(t.kod_sotr,t.god)),'DD MON";"')+6),'dd mon";"') as внеочередной FROM GRAFIK t, USERS u
where t.KOD_SOTR = 109909 and t.kod_sotr = u.KOD_SOTR;

То бишь так пишет, что нет аргументов. Значит надо что то менять в функции, но не могу додуматься, что именно. Подскажите пожалуйста!
...
Рейтинг: 0 / 0
Дни отпуска
    #39448946
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Ну если одна неделя, то он пишет, что нехватает чисел. Здорово.

И что тут теперь писать?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace FUNCTION get_week_list3(i_code IN INTEGER, i_year in integer) RETURN VARCHAR2 IS
  l_list  VARCHAR2(32767);
  l_res   VARCHAR2(4000);
BEGIN
SELECT listagg('CASE WHEN '||column_name||' IN(''у'') THEN '||''''|| to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd mon')||''''|| '||''; '' ELSE NULL END ' ,'||') 
WITHIN GROUP(ORDER BY 1)
  INTO  l_list
  FROM  user_tab_columns
  WHERE TABLE_NAME = 'GRAFIK' 
  AND column_name LIKE 'N%';
EXECUTE IMMEDIATE 'SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year' INTO l_res USING i_code,i_year;
RETURN RTRIM(l_res);
END;




Тут надо строку
Код: sql
1.
2.
SELECT listagg('CASE WHEN '||column_name||' IN(''у'') THEN '||''''|| to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd mon')||''''|| '||''; '' ELSE NULL END ' ,'||') 


менять?
...
Рейтинг: 0 / 0
Дни отпуска
    #39448948
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..,
Тут надо строку менять?

нет потому что поменяет всем, у Вас нет признака конца непрыревного интервала

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39448951
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

А что же тогда делать? В вызове копаться?
...
Рейтинг: 0 / 0
Дни отпуска
    #39448952
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,

ой
непрыревного = неперервного

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39448958
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

перепИсать

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39448961
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Подскажите пожалуйста, что конкретно надо переписать здесь?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace FUNCTION get_week_list3(i_code IN INTEGER, i_year in integer) RETURN VARCHAR2 IS
  l_list  VARCHAR2(32767);
  l_res   VARCHAR2(4000);
BEGIN
SELECT listagg('CASE WHEN '||column_name||' IN(''у'') THEN '||''''|| to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd mon')||''''|| '||''; '' ELSE NULL END ' ,'||') 
WITHIN GROUP(ORDER BY 1)
  INTO  l_list
  FROM  user_tab_columns
  WHERE TABLE_NAME = 'GRAFIK' 
  AND column_name LIKE 'N%';
EXECUTE IMMEDIATE 'SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year' INTO l_res USING i_code,i_year;
RETURN RTRIM(l_res);
END;
...
Рейтинг: 0 / 0
Дни отпуска
    #39448979
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лдано, шут с той функцией. Мне нужно разобраться с этой, здесь он ищет интервалы и выводит первую и последнюю неделю отпуска. А надо чтобы выводило начало отпуска (1 число недели) и конец (воскресенье последней недели). Но как бы я не пытался, он у меня либо всё преобразует в воскресенье, либо ничего. Помогите разобраться, что здесь надо поменять?
Код: sql
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.
create or replace FUNCTION
 week_fun10(i_code IN INTEGER, i_year in integer)
RETURN VARCHAR2 IS
l_list VARCHAR2(32767);
 l_res VARCHAR2(4000);
 BEGIN SELECT listagg(column_name,',') WITHIN GROUP(ORDER BY to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd.mon'))
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';
   l_list:='with t2 as(
  select God, Kod_sotr,'||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year)'||
  q'~
 select /* God, Kod_sotr, */ listagg(lag_WN) within group (order by RN,Kod_sotr) vacation
  from (
  select rownum RN, God, Kod_sotr,
  case when lead(Week_Number) over(PARTITION by God order by Kod_sotr) - Week_number > 1 then /*Weeks*/Weeks_D||';'
      when lead(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||';'
       when lag(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||','
       when Week_number - lag(Week_Number) over(PARTITION by God order by Kod_sotr) > 1 then  /*Weeks*/Weeks_D||','
       else null end lag_WN
          from (
                   select God, Kod_sotr, /*weeks*/
to_char(trunc(to_date(god,'yyyy'),'y')+(cast(ltrim(weeks,'N') as number)-1)*7,'dd mon') Weeks_D, 
                   Vacation, cast(ltrim(weeks,'N')as number) Week_Number from t2
                  unpivot (vacation for weeks in (~'||l_list||q'~))
                 order by God, Kod_sotr, cast(ltrim(weeks,'N')as number)
                )where vacation='б'
          )group by god, Kod_sotr~';
   EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
  RETURN RTRIM(l_res);
  END;
...
Рейтинг: 0 / 0
Дни отпуска
    #39448995
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Norman94,

Забыл сказать важную вещь. В таблице у меня под неделями стоят буквы, обозначающие недели, по которым функция вытаскивает недели, и, заодно преобразует названия столбцов N(любое число) в соответствующее число месяца. То есть получается, что у меня отпуск выходит с 15 мая по 29 мая. Но 29 мая это последняя неделя, а значит нужно не 29 мая, а 4 июня. Подскажите как это реализовать в функции выше?
...
Рейтинг: 0 / 0
Дни отпуска
    #39449089
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Простите, у вас есть какие нибудь идеи?
...
Рейтинг: 0 / 0
Дни отпуска
    #39449116
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94То есть получается, что у меня отпуск выходит с 15 мая по 29 мая.
скорей бы уже
...
Рейтинг: 0 / 0
Дни отпуска
    #39449120
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..,

Простите, у вас есть какие нибудь идеи?
переписать (без EXECUTE IMMEDIATE)

pl/sql, так как нюансов у Вас повылазит много
напр в Украине 8.9 выходные, 13-го рабочій
у Вас когда неделя начнется/закончится?


.......
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449128
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..Norman94stax..,

Простите, у вас есть какие нибудь идеи?
переписать (без EXECUTE IMMEDIATE)

pl/sql, так как нюансов у Вас повылазит много
напр в Украине 8.9 выходные, 13-го рабочій
у Вас когда неделя начнется/закончится?

А как отсюда EXECUTE IMMEDIATE убрать?

Код: plsql
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.
create or replace FUNCTION
 week_fun10(i_code IN INTEGER, i_year in integer)
RETURN VARCHAR2 IS
l_list VARCHAR2(32767);
 l_res VARCHAR2(4000);
 BEGIN SELECT listagg(column_name,',') WITHIN GROUP(ORDER BY to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd.mon'))
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';
   l_list:='with t2 as(
  select God, Kod_sotr,'||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year)'||
  q'~
 select /* God, Kod_sotr, */ listagg(lag_WN) within group (order by RN,Kod_sotr) vacation
  from (
  select rownum RN, God, Kod_sotr,
  case when lead(Week_Number) over(PARTITION by God order by Kod_sotr) - Week_number > 1 then /*Weeks*/Weeks_D||';'
      when lead(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||';'
       when lag(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||','
       when Week_number - lag(Week_Number) over(PARTITION by God order by Kod_sotr) > 1 then  /*Weeks*/Weeks_D||','
       else null end lag_WN
          from (
                   select God, Kod_sotr, /*weeks*/
to_char(trunc(to_date(god,'yyyy'),'y')+(cast(ltrim(weeks,'N') as number)-1)*7,'dd mon') Weeks_D, 
                   Vacation, cast(ltrim(weeks,'N')as number) Week_Number from t2
                  unpivot (vacation for weeks in (~'||l_list||q'~))
                 order by God, Kod_sotr, cast(ltrim(weeks,'N')as number)
                )where vacation='б'
          )group by god, Kod_sotr~';
   EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
  RETURN RTRIM(l_res);
  END;



Ну мы выходные в рассчёт не берем, так что понедельник начинается с 15 числа, а заканчивается 21. То же самое с отпуском, то есть начало - это первое число недели, последнее - конец. Я даже ума не приложу как это реализовать.

.......
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449129
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Тьфу то есть

Ну мы выходные в рассчёт не берем, так что понедельник начинается с 15 числа, а заканчивается 21. То же самое с отпуском, то есть начало - это первое число недели, последнее - конец. Я даже ума не приложу как это реализовать.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449151
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94так что понедельник начинается с 15 числа, а заканчивается 21.
Код: plsql
1.
2.
3.
4.
5.
select level week
      ,trunc(trunc(sysdate, 'yyyy'), 'iw') + level * 7 rus_mon
      ,trunc(sysdate, 'yyyy') + level * 7 rus_sun
from   dual
connect by level < 53
...
Рейтинг: 0 / 0
Дни отпуска
    #39449154
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94так что понедельник начинается с 15 числа, а заканчивается 21
а вторник начинается с 22 по ....?
...
Рейтинг: 0 / 0
Дни отпуска
    #39449155
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..,

Тьфу то есть

Ну мы выходные в рассчёт не берем, так что понедельник начинается с 15 числа, а заканчивается 21. То же самое с отпуском, то есть начало - это первое число недели, последнее - конец. Я даже ума не приложу как это реализовать.
я б загнав 53 N в масив, а там уже что угодно
можно конечно и ф-цию менять, но то к ххl


ps
не надо боятся влоб перечислять 53поля таблицы, в етом нет никакого крамола
......
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449163
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123ййNorman94так что понедельник начинается с 15 числа, а заканчивается 21.
Код: plsql
1.
2.
3.
4.
5.
select level week
      ,trunc(trunc(sysdate, 'yyyy'), 'iw') + level * 7 rus_mon
      ,trunc(sysdate, 'yyyy') + level * 7 rus_sun
from   dual
connect by level < 53



Ого, интересно. Но получится ли это совместить с этой строкой?
Код: sql
1.
2.
3.
4.
greatest(
                   trunc (to_date(god, 'yyyy')+(cast(LTRIM(weeks,'N')as number)-1)*7 -6, 'iw')
                 ,to_date(god||'0101', 'yyyymmdd'))
             ,'dd mon')


(взято из контекста функции выше)
...
Рейтинг: 0 / 0
Дни отпуска
    #39449168
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

В этом вся беда - динамика - главное требование. Я бы и сам не заморачивался со всем этим.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449170
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123ййNorman94так что понедельник начинается с 15 числа, а заканчивается 21.
Код: plsql
1.
2.
3.
4.
5.
select level week
      ,trunc(trunc(sysdate, 'yyyy'), 'iw') + level * 7 rus_mon
      ,trunc(sysdate, 'yyyy') + level * 7 rus_sun
from   dual
connect by level < 53


iw week of year (1-52 or 1-53 ) based on the ISO standard.

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449177
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,
может предложишь за него все сделать ?
с учетом
автор В этой таблице есть столбцы год, код сотрудника и 52 столбца
...
Рейтинг: 0 / 0
Дни отпуска
    #39449181
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем попытался изменить изменение названия столбца в даты в соответствии с тем, что кинули выше

Код: plsql
1.
2.
3.
4.
5.
select God, Kod_sotr, /*weeks*/to_char(
                greatest(
                   (trunc (to_date(god, 'yyyy')+(cast(LTRIM(weeks,'N')as number)-1)*7 -6, 'iw'), trunc (to_date(god, 'yyyy')+(cast(LTRIM(weeks,'N')as number)-1)*7)
                 ,to_date(god||'0101', 'yyyymmdd'))
             ,'dd mon') Weeks_D,



Но ошибка в missing right parameters
...
Рейтинг: 0 / 0
Дни отпуска
    #39449183
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

А напомни, откуда взялось требование про динамику в задаче со статичными условиями?
...
Рейтинг: 0 / 0
Дни отпуска
    #39449186
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..,

В этом вся беда - динамика - главное требование. Я бы и сам не заморачивался со всем этим.
можно ж и
EXECUTE IMMEDIATE 'declare ... begin ... end;'

ps
если чесно странные у Вас требования, и главное Вы упорно игнорируете что в году 53 недели

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449188
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Дни отпуска
    #39449189
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..Norman94stax..,

В этом вся беда - динамика - главное требование. Я бы и сам не заморачивался со всем этим.
можно ж и
EXECUTE IMMEDIATE 'declare ... begin ... end;'

ps
если чесно странные у Вас требования, и главное Вы упорно игнорируете что в году 53 недели

.....
stax

А пример можно?

Да я не игнорю, я просто забываю об этом) Да, 53 недели)
...
Рейтинг: 0 / 0
Дни отпуска
    #39449198
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не получается даже с таким шаманством

Код: sql
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.
create or replace FUNCTION
 week_fun300(i_code IN INTEGER, i_year in integer)
RETURN VARCHAR2 IS
l_list VARCHAR2(32767);
 l_res VARCHAR2(4000);
 BEGIN SELECT listagg(column_name,',') WITHIN GROUP(ORDER BY to_char(
                greatest(
                   trunc (to_date(i_year||'0101', 'yyyymmdd')+((LTRIM(column_name,'N'))-1)*7, 'iw')
                 ,to_date(i_year||'0101', 'yyyymmdd'))
             ,'dd mon'))
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';
   l_list:='with t2 as(
  select God, Kod_sotr,'||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year)'||
  q'~
 select /* God, Kod_sotr, */ listagg(lag_WN) within group (order by RN,Kod_sotr) vacation
  from (
  select rownum RN, God, Kod_sotr,
  case when lead(Week_Number) over(PARTITION by God order by Kod_sotr) - Week_number > 1 then /*Weeks*/Weeks_D||';'
      when lead(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||';'
       when lag(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||','
       when Week_number - lag(Week_Number) over(PARTITION by God order by Kod_sotr) > 1 then  /*Weeks*/Weeks_D||','
       else null end lag_WN
          from (
                   select God, Kod_sotr, /*weeks*/[color=red]to_char(
                greatest(
                   trunc (to_date(god||'0101', 'yyyymmdd')+(cast(LTRIM(weeks,'N'))-1)*7, 'iw'), trunc (to_date(god, 'yyyy')+(cast(LTRIM(weeks,'N')as number)-1)*7)
                 ,to_date(god||'0101', 'yyyymmdd') Weeks_D, [/color]
                   Vacation, cast(ltrim(weeks,'N')as number) Week_Number from t2
                  unpivot (vacation for weeks in (~'||l_list||q'~))
                 order by God, Kod_sotr, cast(ltrim(weeks,'N')as number)
                )where vacation='о'
          )group by god, Kod_sotr~';
   EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
  RETURN RTRIM(l_res);
  END;




Missing keyword :(
...
Рейтинг: 0 / 0
Дни отпуска
    #39449226
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..пропущено...

можно ж и
EXECUTE IMMEDIATE 'declare ... begin ... end;'

ps
если чесно странные у Вас требования, и главное Вы упорно игнорируете что в году 53 недели

.....
stax

А пример можно?

Да я не игнорю, я просто забываю об этом) Да, 53 недели)

Вам простенький селект (один из 5000 на непрывные интервалы)
добавте любимую Вами динамику

Код: plsql
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.
with u as ( --разворачиаем недели вертикально
select * from grafik unpivot (vacation for weeks in (
--сгенеріть із user_tables
n1 as '01',n2 as '02',n3 as'03',n4 as '04',n5 as '05',n6 as '06',n7 as '07',n8 as '08',n9 as '09',n10 as '10'
))
where god=2017 and kod_sotr=202
)
,w as ( --номеруем для поиска непрырывных
 select 
   u.*
  ,trunc (to_date(god||'0101', 'yyyymmdd') + (weeks-1)*7, 'ww') d
  ,row_number() over (order by weeks) rn
 from u 
 where vacation='o')
--склеиваем результат в строку
select listagg(min(d)||':'||(max(d)+5),'; ') within group (order by min(d)) res
from w
group by god,kod_sotr,d-rn*7
/
SQL> /

RES
--------------------------------------------------------------------------------
15.01.17:27.01.17; 05.02.17:10.02.17; 19.02.17:10.03.17

SQL> select * from grafik;

       GOD   KOD_SOTR N N N N N N N N N N
---------- ---------- - - - - - - - - - -
      2017        222 у   o o у o у o   o
      2017        202   у o o у o у o o o
      2017        111 o   у у у   у   o



зы
если не получится, я добавлю EXECUTE IMMEDIATE

......
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449231
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня не получается совместить ваш метод с динамикой.

То есть я не могу понять куда подставлять LISTAGG WITHIN GROUP и т.д.

Я с этой пытаюсь совместить

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace FUNCTION get_week_list3(i_code IN INTEGER, i_year in integer) RETURN VARCHAR2 IS
  l_list  VARCHAR2(32767);
  l_res   VARCHAR2(4000);
BEGIN
SELECT listagg('CASE WHEN '||column_name||' IN(''у'') THEN '||''''|| to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd mon')||''''|| '||''; '' ELSE NULL END ' ,'||') 
WITHIN GROUP(ORDER BY 1)
  INTO  l_list
  FROM  user_tab_columns
  WHERE TABLE_NAME = 'GRAFIK' 
  AND column_name LIKE 'N%';
EXECUTE IMMEDIATE 'SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year' INTO l_res USING i_code,i_year;
RETURN RTRIM(l_res);
END;
...
Рейтинг: 0 / 0
Дни отпуска
    #39449236
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,
счас сделаю
дайте токо строк, будет Вам и белка и свисток

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449241
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Cтойте, я ошибся, нужно с этой совместить

Код: sql
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.
create or replace FUNCTION
 week_fun200(i_code IN INTEGER, i_year in integer)
RETURN VARCHAR2 IS
l_list VARCHAR2(32767);
 l_res VARCHAR2(4000);
 BEGIN SELECT listagg(column_name,',') WITHIN GROUP(ORDER BY to_char(
                greatest(
                   trunc (to_date(i_year||'0101', 'yyyymmdd')+((LTRIM(column_name,'N'))-1)*7, 'iw')
                 ,to_date(i_year||'0101', 'yyyymmdd'))
             ,'dd mon'))
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';
   l_list:='with t2 as(
  select God, Kod_sotr,'||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year)'||
  q'~
 select /* God, Kod_sotr, */ listagg(lag_WN) within group (order by RN,Kod_sotr) vacation
  from (
  select rownum RN, God, Kod_sotr,
  case when lead(Week_Number) over(PARTITION by God order by Kod_sotr) - Week_number > 1 then /*Weeks*/Weeks_D||';'
      when lead(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||';'
       when lag(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||','
       when Week_number - lag(Week_Number) over(PARTITION by God order by Kod_sotr) > 1 then  /*Weeks*/Weeks_D||','
       else null end lag_WN
          from (
                   select God, Kod_sotr, /*weeks*/to_char(
                greatest(
                   trunc (to_date(god, 'yyyy')+(cast(LTRIM(weeks,'N')as number)-1)*7 -6, 'iw')
                 ,to_date(god||'0101', 'yyyymmdd'))
             ,'dd mon') Weeks_D, 
                   Vacation, cast(ltrim(weeks,'N')as number) Week_Number from t2
                  unpivot (vacation for weeks in (~'||l_list||q'~))
                 order by God, Kod_sotr, cast(ltrim(weeks,'N')as number)
                )where vacation='о'
          )group by god, Kod_sotr~';
   EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
  RETURN RTRIM(l_res);
  END;


Строки строки...
...
Рейтинг: 0 / 0
Дни отпуска
    #39449269
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

Вот тебе твой селект, жаль сам не за хотел разобраться как он работает
Код: plsql
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.
with t2 as(
select '2017' god, '1' kod_sort, 'o' N1, null N2, 'o' N3, 'o' N4, null N5, null N6, 'o' N7, 'o' N8, 'o' N9, 'o' N10, null N11 from dual union all
select '2017' god, '2' kod_sort, null N1, 'o' N2, 'o' N3, 'o' N4, null N5, 'o' N6, 'o' N7, 'o' N8, 'o' N9, 'o' N10, null N11 from dual union all
select '2017' god, '3' kod_sort, 'o' N1, 'o' N2, 'o' N3, 'o' N4, null N5, null N6, 'o' N7, 'o' N8, 'o' N9, null N10, null N11 from dual union all
select '2017' god, '4' kod_sort, 'o' N1, null N2, 'o' N3, 'o' N4, null N5, null N6, 'o' N7, 'o' N8, 'o' N9, 'o' N10, 'o' N11 from dual)

select  Kod_Sort, listagg(lag_WN) within group (order by RN,kod_sort) vacation 
from (
select rownum RN, Kod_Sort,Week_Number,vacation,

case when ((lead(Week_Number,1,100) over(PARTITION by Kod_Sort order by Kod_Sort)- Week_number )>1) and 
          ((Week_number - lag(Week_Number,1,-1) over(PARTITION by Kod_Sort order by Kod_Sort)) > 1 )  then Begin_Week||'-'||End_week||'; '
          
     when lead(Week_Number,1,100) over(PARTITION by Kod_Sort order by Kod_Sort) - Week_number > 1 then End_week||'; '
     when Week_number - lag(Week_Number,1,-1) over(PARTITION by Kod_Sort order by Kod_Sort) > 1 then Begin_Week||'-'
     else null end lag_WN
         from (
                select Kod_Sort, Vacation, to_number(ltrim(weeks,'N')) Week_Number,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+6,'dd mon') End_week
                from t2
                unpivot (vacation for weeks in (N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11))
                order by Kod_Sort, to_number(ltrim(weeks,'N'))
              )where vacation='о'
order by Kod_Sort, Week_Number
)
group by Kod_Sort



Kod_Sort vacation

1 01 jan-07 jan; 15 jan-28 jan; 12 feb-11 mar;
2 08 jan-28 jan; 05 feb-11 mar;
3 01 jan-28 jan; 12 feb-04 mar;
4 01 jan-07 jan; 15 jan-28 jan; 12 feb-18 mar;


Теперь САМ переведи его в динамику и пользуй
но лучше разберись КАК он работает
...
Рейтинг: 0 / 0
Дни отпуска
    #39449280
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Спасибо большое!

Я перевёл в динамический, но теперь он пишет missing expresion

Подскажите, где я ошибся?

Код: sql
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.
create or replace FUNCTION
 week_fun300(i_code IN INTEGER, i_year in integer)
RETURN VARCHAR2 IS
l_list VARCHAR2(32767);
 l_res VARCHAR2(4000);
 BEGIN SELECT listagg(column_name,',') WITHIN GROUP(ORDER BY to_char(
                greatest(
                   trunc (to_date(i_year||'0101', 'yyyymmdd')+((LTRIM(column_name,'N'))-1)*7, 'iw')
                 ,to_date(i_year||'0101', 'yyyymmdd'))
             ,'dd mon'))
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';
   l_list:='with t2 as(
  select God, Kod_sotr,'||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year)'||
  q'~
  select /* God, Kod_sotr, */, listagg(lag_WN) within group (order by RN,kod_sort) vacation 
from (
select rownum RN, Kod_Sort,Week_Number,vacation,
case when ((lead(Week_Number,1,100) over(PARTITION by Kod_Sort order by Kod_Sort)- Week_number )>1) and 
          ((Week_number - lag(Week_Number,1,-1) over(PARTITION by Kod_Sort order by Kod_Sort)) > 1 )  then Begin_Week||'-'||End_week||'; '
          
     when lead(Week_Number,1,100) over(PARTITION by Kod_Sort order by Kod_Sort) - Week_number > 1 then End_week||'; '
     when Week_number - lag(Week_Number,1,-1) over(PARTITION by Kod_Sort order by Kod_Sort) > 1 then Begin_Week||'-'
     else null end lag_WN
         from (
                select Kod_Sort, Vacation, to_number(ltrim(weeks,'N')) Week_Number,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+6,'dd mon') End_week
                from t2
                unpivot (vacation for weeks in (~'||l_list||q'~))
                order by Kod_Sort, to_number(ltrim(weeks,'N'))
              )where vacation='о'
order by Kod_Sort, Week_Number
)
group by Kod_Sort~';
   EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
  RETURN RTRIM(l_res);
  END;
...
Рейтинг: 0 / 0
Дни отпуска
    #39449284
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..,

Cтойте, я ошибся, нужно с этой совместить

Код: sql
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.
create or replace FUNCTION
 week_fun200(i_code IN INTEGER, i_year in integer)
RETURN VARCHAR2 IS
l_list VARCHAR2(32767);
 l_res VARCHAR2(4000);
 BEGIN SELECT listagg(column_name,',') WITHIN GROUP(ORDER BY to_char(
                greatest(
                   trunc (to_date(i_year||'0101', 'yyyymmdd')+((LTRIM(column_name,'N'))-1)*7, 'iw')
                 ,to_date(i_year||'0101', 'yyyymmdd'))
             ,'dd mon'))
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';
   l_list:='with t2 as(
  select God, Kod_sotr,'||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year)'||
  q'~
 select /* God, Kod_sotr, */ listagg(lag_WN) within group (order by RN,Kod_sotr) vacation
  from (
  select rownum RN, God, Kod_sotr,
  case when lead(Week_Number) over(PARTITION by God order by Kod_sotr) - Week_number > 1 then /*Weeks*/Weeks_D||';'
      when lead(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||';'
       when lag(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||','
       when Week_number - lag(Week_Number) over(PARTITION by God order by Kod_sotr) > 1 then  /*Weeks*/Weeks_D||','
       else null end lag_WN
          from (
                   select God, Kod_sotr, /*weeks*/to_char(
                greatest(
                   trunc (to_date(god, 'yyyy')+(cast(LTRIM(weeks,'N')as number)-1)*7 -6, 'iw')
                 ,to_date(god||'0101', 'yyyymmdd'))
             ,'dd mon') Weeks_D, 
                   Vacation, cast(ltrim(weeks,'N')as number) Week_Number from t2
                  unpivot (vacation for weeks in (~'||l_list||q'~))
                 order by God, Kod_sotr, cast(ltrim(weeks,'N')as number)
                )where vacation='о'
          )group by god, Kod_sotr~';
   EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
  RETURN RTRIM(l_res);
  END;


Строки строки...

в чем разница? почему минус 6 (*7 -6)?

Код: plsql
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.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
declare
 function f ( p_god number,p_kod_sotr number, p_vacation varchar2 :='o')
 return varchar2
is
 l_res varchar2(4000);
 l_list VARCHAR2(32767);
begin
 SELECT listagg(column_name||' as '''||lpad(ltrim(column_name,'N'),2,'0')||'''',',') WITHIN GROUP(ORDER BY null)
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';
l_list:=q'[
with u as ( --разворачиаем недели вертикально
select * from grafik unpivot (vacation for weeks in (
--сгенеріть із user_tables
]'||l_list||
q'[
))
where god=:g and kod_sotr=:s
)
,w as ( --номеруем для поиска непрырывных
 select
   u.*
--  ,trunc (to_date(god||'0101', 'yyyymmdd') + (weeks-1)*7, 'ww') d
    ,greatest(
     trunc (to_date(god||'0101', 'yyyymmdd')+(weeks-1)*7, 'iw')
     ,to_date(god||'0101', 'yyyymmdd')) d
  ,row_number() over (order by weeks) rn
 from u
 where vacation=:o)
--склеиваем результат в строку
select 
 listagg(to_char(min(d),'dd Mon')||':'||
     to_char(least(add_months(trunc(min(d),'y'),12)-1,max(d)+5),'dd Mon'),'; ') 
 within group (order by min(d)) res
from w
group by god,kod_sotr,d-rn*7
]';
 EXECUTE IMMEDIATE l_list INTO l_res USING p_god,p_kod_sotr,p_vacation;
 return l_res;
end;
begin
 dbms_output.put_line(f(2017,202));
end;
/
SQL> /
09 Січ:21 Січ; 30 Січ:04 Лют; 13 Лют:04 Бер; 18 Гру:30 Гру

SQL> select * from GRAFIK;

       GOD   KOD_SOTR N N N N N N N N N N N N
---------- ---------- - - - - - - - - - - - -
      2017        222 у   o o у o у o   o
      2017        202   у o o у o у o o o o o
      2017        111 o   у у у   у   o

SQL> desc GRAFIK;
 Name
 ------------------------------------------------
 GOD
 KOD_SOTR
 N1
 N2
 N3
 N4
 N5
 N6
 N7
 N8
 N9
 N10
 N52
 N53
...
Рейтинг: 0 / 0
Дни отпуска
    #39449285
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94MaximaXXL,

Спасибо большое!

Я перевёл в динамический, но теперь он пишет missing expresion

Подскажите, где я ошибся?

Код: sql
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.
create or replace FUNCTION
 week_fun300(i_code IN INTEGER, i_year in integer)
RETURN VARCHAR2 IS
l_list VARCHAR2(32767);
 l_res VARCHAR2(4000);
 BEGIN SELECT listagg(column_name,',') WITHIN GROUP(ORDER BY to_char(
                greatest(
                   trunc (to_date(i_year||'0101', 'yyyymmdd')+((LTRIM(column_name,'N'))-1)*7, 'iw')
                 ,to_date(i_year||'0101', 'yyyymmdd'))
             ,'dd mon'))
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';
   l_list:='with t2 as(
  select God, Kod_sotr,'||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year)'||
  q'~
  select /* God, Kod_sotr, */, listagg(lag_WN) within group (order by RN,kod_sort) vacation 
from (
select rownum RN, Kod_Sort,Week_Number,vacation,
case when ((lead(Week_Number,1,100) over(PARTITION by Kod_Sort order by Kod_Sort)- Week_number )>1) and 
          ((Week_number - lag(Week_Number,1,-1) over(PARTITION by Kod_Sort order by Kod_Sort)) > 1 )  then Begin_Week||'-'||End_week||'; '
          
     when lead(Week_Number,1,100) over(PARTITION by Kod_Sort order by Kod_Sort) - Week_number > 1 then End_week||'; '
     when Week_number - lag(Week_Number,1,-1) over(PARTITION by Kod_Sort order by Kod_Sort) > 1 then Begin_Week||'-'
     else null end lag_WN
         from (
                select Kod_Sort, Vacation, to_number(ltrim(weeks,'N')) Week_Number,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+6,'dd mon') End_week
                from t2
                unpivot (vacation for weeks in (~'||l_list||q'~))
                order by Kod_Sort, to_number(ltrim(weeks,'N'))
              )where vacation='о'
order by Kod_Sort, Week_Number
)
group by Kod_Sort~';
   EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
  RETURN RTRIM(l_res);
  END;



/* God, Kod_sotr, */, - лишняя запетуха
...
Рейтинг: 0 / 0
Дни отпуска
    #39449294
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..with u as ( --разворачиаем недели вертикально
сначала свернем недели а потом развернем их ?
...
Рейтинг: 0 / 0
Дни отпуска
    #39449300
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL, stax..

Я безмерно благодарен вам. Я поднастроил всё под себя, взяв от одного варианта и другого, теперь всё получилось!

автор почему минус 6 (*7 -6)?

Прикол в том, что он начинал отсчёт не с понедельника, а с воскресенья. Видимо что то с системными датами напутано..
...
Рейтинг: 0 / 0
Дни отпуска
    #39449306
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Norman94,

MaximaXXL

Если не сложно помогите понять эти строки
авторcase when lead(Week_Number) over(PARTITION by God order by Kod_sotr) - Week_number > 1 then /*Weeks*/Weeks_D||';'
when lead(Week_Number) over(PARTITION by God order by Kod_sotr) is null then /*Weeks*/Weeks_D||';'
when lag(Week_Number) over(PARTITION by God order by Kod_sotr) is null then /*Weeks*/Weeks_D||','
when Week_number - lag(Week_Number) over(PARTITION by God order by Kod_sotr) > 1 then /*Weeks*/Weeks_D||','
else null end lag_WN


Что здесь происходит?
...
Рейтинг: 0 / 0
Дни отпуска
    #39449311
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123ййstax..with u as ( --разворачиаем недели вертикально
сначала свернем недели а потом развернем их ?
можна по разному, ето один из вариантов, мне кажется самым простым

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449314
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94MaximaXXL, stax..

Я безмерно благодарен вам. Я поднастроил всё под себя, взяв от одного варианта и другого, теперь всё получилось!

автор почему минус 6 (*7 -6)?

Прикол в том, что он начинал отсчёт не с понедельника, а с воскресенья. Видимо что то с системными датами напутано..

ето ЗАГОТОВКА, надо допиливать под себя
напр
конец недели я добавлял 5, но мож надо 4 или 6
наскоко помню первая неделя у вас хитрая (greatest ...), соответственно окончание надо тож доработать

с "приколом -6" надо разобраться, в 2018 и далее все будет хорошо?

и тд

......
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449325
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..Norman94MaximaXXL, stax..

Я безмерно благодарен вам. Я поднастроил всё под себя, взяв от одного варианта и другого, теперь всё получилось!

пропущено...


Прикол в том, что он начинал отсчёт не с понедельника, а с воскресенья. Видимо что то с системными датами напутано..

ето ЗАГОТОВКА, надо допиливать под себя
напр
конец недели я добавлял 5, но мож надо 4 или 6
наскоко помню первая неделя у вас хитрая (greatest ...), соответственно окончание надо тож доработать

с "приколом -6" надо разобраться, в 2018 и далее все будет хорошо?

и тд

......
stax

А сейчас с этим балуюсь

Доработал эти строчки
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
from (
                select Kod_sotr, Vacation, to_number(ltrim(weeks,'N')) Week_Number,
                to_char(
                greatest(
                   trunc (to_date(god, 'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon')
                 ,to_date(god||'0101', 'yyyymmdd'))
             ,'dd mon') Begin_Week,
                to_char(
                greatest(
                   trunc (to_date(god, 'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon')
                 ,to_date(god||'0101', 'yyyymmdd'))
             ,'dd mon') End_Week




Но выскакивает ошибка

too many precision specifiers

В чём может быть дело?
...
Рейтинг: 0 / 0
Дни отпуска
    #39449333
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..наскоко помню первая неделя у вас хитрая (greatest ...), соответственно окончание надо тож доработать
......
stax

подправил

Код: plsql
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.
52.
53.
54.
55.
declare
 function f ( p_god number,p_kod_sotr number, p_vacation varchar2 :='o')
 return varchar2
is
 l_res varchar2(4000);
 l_list VARCHAR2(32767);
begin
 SELECT listagg(column_name||' as '''||lpad(ltrim(column_name,'N'),2,'0')||'''',',') WITHIN GROUP(ORDER BY null)
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';
l_list:=q'[
with u as ( --разворачиаем недели вертикально
select * from grafik unpivot (vacation for weeks in (
--сгенеріть із user_tables
]'||l_list||
q'[
))
where god=:g and kod_sotr=:s
)
,w as ( --номеруем для поиска непрырывных
 select
   u.*
--  ,trunc (to_date(god||'0101', 'yyyymmdd') + (weeks-1)*7, 'ww') d
    ,greatest(
     trunc (to_date(god||'0101', 'yyyymmdd')+(weeks-1)*7, 'iw')
     ,to_date(god||'0101', 'yyyymmdd')) d
  ,row_number() over (order by weeks) rn
 from u
 where vacation=:o)
--склеиваем результат в строку
select
 listagg(to_char(min(d),'dd Mon')||':'||
     to_char(least(add_months(trunc(min(d),'y'),12)-1,trunc(max(d)+7,'iw')-1),'dd Mon'),'; ')
 within group (order by min(d)) res
from w
group by god,kod_sotr,d-rn*7
]';
 EXECUTE IMMEDIATE l_list INTO l_res USING p_god,p_kod_sotr,p_vacation;
 return l_res;
end;
begin
 dbms_output.put_line(f(2017,111));
end;
/
SQL> /
01 Січ:01 Січ; 20 Лют:26 Лют

SQL> select * from GRAFIK;

       GOD   KOD_SOTR N N N N N N N N N N N N
---------- ---------- - - - - - - - - - - - -
      2017        222 у   o o у o у o   o
      2017        202   у o o у o у o o o o o
      2017        111 o   у у у   у   o
...
Рейтинг: 0 / 0
Дни отпуска
    #39449336
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

А посмотрите в чём у меня может быть ошибка? Почему он ругается?
...
Рейтинг: 0 / 0
Дни отпуска
    #39449340
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94
А сейчас с этим балуюсь

Доработал эти строчки
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
from (
                select Kod_sotr, Vacation, to_number(ltrim(weeks,'N')) Week_Number,
                to_char(
                greatest(
                   trunc (to_date(god, 'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon')
                 ,to_date(god||'0101', 'yyyymmdd'))
             ,'dd mon') Begin_Week,
                to_char(
                greatest(
                   trunc (to_date(god, 'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon')
                 ,to_date(god||'0101', 'yyyymmdd'))
             ,'dd mon') End_Week




Но выскакивает ошибка

too many precision specifiers

В чём может быть дело?
нельзя trunc 'dd mon'


.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449345
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Norman94
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
to_char(
                greatest(
                   trunc (to_date(god, 'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon')
                 ,to_date(god||'0101', 'yyyymmdd'))
             ,'dd mon') Begin_Week,
                to_char(
                greatest(
                   trunc (to_date(god, 'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon')
                 ,to_date(god||'0101', 'yyyymmdd'))
             ,'dd mon') End_Week



stax..,

Это в какой строчке из?
Код: sql
1.
2.
to_char(greatest( trunc (to_date(god, 'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon'),to_date(god||'0101', 'yyyymmdd')),'dd mon') Begin_Week,
                to_char(greatest( trunc (to_date(god, 'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7 +7,'dd mon'),to_date(god||'0101', 'yyyymmdd')),'dd mon') End_Week



Покажите пожалуйста
...
Рейтинг: 0 / 0
Дни отпуска
    #39449353
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Norman94
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
to_char(
                greatest(
                   trunc (to_date(god, 'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon')
                 ,to_date(god||'0101', 'yyyymmdd'))
             ,'dd mon') Begin_Week,
                to_char(
                greatest(
                   trunc (to_date(god, 'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon')
                 ,to_date(god||'0101', 'yyyymmdd'))
             ,'dd mon') End_Week



stax..,

Это в какой строчке из?

[/src]

Покажите пожалуйста
...
Рейтинг: 0 / 0
Дни отпуска
    #39449354
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Я немного поменял строки на

Код: sql
1.
2.
to_char(greatest(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+1,'dd mon'), (to_date(to_date(god,'yyyy'),'y'))) Begin_Week,
                 to_char(greatest(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon'),(to_date(to_date(god,'yyyy'),'y'))) End_Week


Теперь он пишет, что ожидал число а получил дату.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449355
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Но у юзера, что кинул выше в оригинале строки выглядят так, и они работают

Код: sql
1.
2.
 to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon') End_week
...
Рейтинг: 0 / 0
Дни отпуска
    #39449369
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
to_char(greatest(trunc (to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7,'iw'),to_date(god, 'yyyy'),'dd mon') Begin_Week,
to_char(greatest(trunc (to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +6,'iw'),to_date(god, 'yyyy'),'dd mon') End_Week



И даже так теперь не работает. Не могу понять почему.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449370
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..можна по разному, ето один из вариантов, мне кажется самым простым
под рукой только 10 и напильник забыл дома
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with t as (select xmltype(DBMS_XMLGEN.getxml('select * from GRAFIK g where g.god=2017 and g.kod_sotr=1')) xmldata from dual)
select     nodename, nodetext 
from t, xmltable('for $i in //*
       return element root { element name { $i/name() }, element txt { $i/text() } }'
    passing t.xmldata
    columns nodename varchar2(20) path '/root/name',
            nodetext varchar2(30) path '/root/txt'
) where nodename like 'N%' ;
...
Рейтинг: 0 / 0
Дни отпуска
    #39449371
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..,

Я немного поменял строки на

Код: sql
1.
2.
to_char(greatest(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+1,'dd mon'), (to_date(to_date(god,'yyyy'),'y'))) Begin_Week,
                 to_char(greatest(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon'),(to_date(to_date(god,'yyyy'),'y'))) End_Week


Теперь он пишет, что ожидал число а получил дату.
я ж не знаю что Вы хотите получить

зачем to_date(to_date?

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449374
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Понимаете, я хочу, что у меня функция воспринимала даты именно в соответствии с годом. Я знаю что это делается с помощью greatest

Вот строки как выглядят в оригинале:

Код: sql
1.
2.
to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon') End_week



Я не могу сообразить как greatest сюда подкрутить
...
Рейтинг: 0 / 0
Дни отпуска
    #39449378
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

Как и раньше, сначала greatest от дат, а уже потом преобразование в строку
...
Рейтинг: 0 / 0
Дни отпуска
    #39449383
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
envNorman94,

Как и раньше, сначала greatest от дат, а уже потом преобразование в строку

Я так и пытаюсь сделать, вот

Код: sql
1.
2.
to_char(greatest(trunc (to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7,'dd mon'),to_date(god, 'yyyy'),'dd mon') Begin_Week,
to_char(greatest(trunc (to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +6,'dd mon'),to_date(god, 'yyyy'),'dd mon') End_Week



Но он пишет, что ждал число, а получил дату
...
Рейтинг: 0 / 0
Дни отпуска
    #39449390
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94envNorman94,

Как и раньше, сначала greatest от дат, а уже потом преобразование в строку

Я так и пытаюсь сделать, вот

Код: sql
1.
2.
to_char(greatest(trunc (to_date(god,'yyyy'),'y' ) зачем?+(to_number(ltrim(weeks,'N'))-1)*7,'dd mon'),
to_date(god, 'yyyy')  нет )  ,'dd mon') Begin_Week,



Но он пишет, что ждал число, а получил дату

ps
Код: plsql
1.
2.
3.
4.
5.
SQL> select to_date(2017,'yyyy') d from dual;

D
--------
01.05.17
...
Рейтинг: 0 / 0
Дни отпуска
    #39449399
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..Norman94пропущено...


Я так и пытаюсь сделать, вот

Код: sql
1.
2.
to_char(greatest(trunc (to_date(god,'yyyy'),'y' ) зачем?+(to_number(ltrim(weeks,'N'))-1)*7,'dd mon'),
to_date(god, 'yyyy')  нет )  ,'dd mon') Begin_Week,




Но он пишет, что ждал число, а получил дату

ps
Код: plsql
1.
2.
3.
4.
5.
SQL> select to_date(2017,'yyyy') d from dual;

D
--------
01.05.17



Код: sql
1.
2.
to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7,'dd mon'),to_date(god, 'yyyy'),'dd mon') Begin_Week,
to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7 +6,'dd mon'),to_date(god, 'yyyy'),'dd mon') End_Week


Missing right parameters
...
Рейтинг: 0 / 0
Дни отпуска
    #39449400
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
иииииииии

Код: sql
1.
2.
to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7,'dd mon')),to_date(god, 'yyyy'),'dd mon') Begin_Week,
to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7 +6,'dd mon')),to_date(god, 'yyyy'),'dd mon') End_Week


Ждал дату, а получил число. Что за чертовщина!
...
Рейтинг: 0 / 0
Дни отпуска
    #39449404
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Ждал дату, а получил число. Что за чертовщина!
где закрывающая скобка для greatest ?
...
Рейтинг: 0 / 0
Дни отпуска
    #39449407
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123йй,

Код: sql
1.
to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7,'dd mon')[color=red])[/color],to_date(god, 'yyyy'),'dd mon') Begin_Week,
...
Рейтинг: 0 / 0
Дни отпуска
    #39449408
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123ййNorman94Ждал дату, а получил число. Что за чертовщина!
где закрывающая скобка для greatest ?

Короче вот она

Код: sql
1.
to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7,'dd mon')),to_date(god, 'yyyy'),'dd mon') Begin_Week,
...
Рейтинг: 0 / 0
Дни отпуска
    #39449409
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123ййNorman94Ждал дату, а получил число. Что за чертовщина!
где закрывающая скобка для greatest ?

Тьфу ты, не умею в цвета


to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7,'dd mon')),to_date(god, 'yyyy'),'dd mon') Begin_Week,
...
Рейтинг: 0 / 0
Дни отпуска
    #39449412
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ладно, ошибка больше не выпадает, однако он теперь ОПЯТЬ начисто игнорирует воскресенья. Вообще. То есть теперь всё как раньше. Что я не так делаю?

Вот строки в оригинале:

Код: sql
1.
2.
to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon') End_week


А вот изменённые.
Код: sql
1.
2.
to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7,'iw'),to_date(god, 'yyyy')),'dd mon') Begin_Week,
to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7 +6,'iw'),to_date(god, 'yyyy')),'dd mon') End_Week
...
Рейтинг: 0 / 0
Дни отпуска
    #39449413
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94123ййпропущено...

где закрывающая скобка для greatest ?

Тьфу ты, не умею в цвета


to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7,'dd mon')),to_date(god, 'yyyy'),'dd mon') Begin_Week,

а надо
to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7,' dd mon '),to_date(god, 'yyyy')),'dd mon') Begin_Week,[/quot]

.........
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449415
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..Norman94пропущено...


Тьфу ты, не умею в цвета


to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7,'dd mon')),to_date(god, 'yyyy'),'dd mon') Begin_Week,

а надо
to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7,' dd mon '),to_date(god, 'yyyy')),'dd mon') Begin_Week,

.........
stax[/quote]

Да да, я так сделал, но теперь всё сломалось, функция как и раньше снова считает по первым дням, а не заглядывает в последние дни, как до greatest. Вообще не понимаю в чём дело.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449416
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Ладно, ошибка больше не выпадает, однако он теперь ОПЯТЬ начисто игнорирует воскресенья. Вообще. То есть теперь всё как раньше. Что я не так делаю?

Вот строки в оригинале:

Код: sql
1.
2.
to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon') End_week


А вот изменённые.
Код: sql
1.
2.
to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7,'iw'),to_date(god, 'yyyy')),'dd mon') Begin_Week,
to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7 +6,'iw'),to_date(god, 'yyyy')),'dd mon') End_Week



что за воскресенья?

я ж Вам кинул подправленный вариант 20460313
...
Рейтинг: 0 / 0
Дни отпуска
    #39449419
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..пропущено...


а надо
to_char(greatest(trunc (to_date(god,'yyyy')+(to_number(ltrim(weeks,'N'))-1)*7,' dd mon '),to_date(god, 'yyyy')),'dd mon') Begin_Week,

.........
stax

Да да, я так сделал, но теперь всё сломалось, функция как и раньше снова считает по первым дням, а не заглядывает в последние дни, как до greatest. Вообще не понимаю в чём дело.[/quot]
оракляча фіча
to_date(god, 'yyyy') счас ето май

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449420
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ваш вариант я использовал в другом месте.

Я уже писал, что в функции которая ищет отпуска по интервалам надо сделать - начало - 1 число недели, конец - воскресенье последней недели отпуска. В этом посту 20460027 юзер привёл отличный пример, но к его подсчётам у меня не получается прикрутить greatest. Точнее, прикрутить получилось, но всё задание слито на корню. А до greatest всё работало как надо.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449443
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я даже не могу понять, в чём дело. Без greatest всё работало как надо, а с ней - он выдаёт чёрти что. Он даже недели не правильно выводит.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449445
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Ваш вариант я использовал в другом месте.

Я уже писал, что в функции которая ищет отпуска по интервалам надо сделать - начало - 1 число недели, конец - воскресенье последней недели отпуска. В этом посту 20460027 юзер привёл отличный пример, но к его подсчётам у меня не получается прикрутить greatest. Точнее, прикрутить получилось, но всё задание слито на корню. А до greatest всё работало как надо.
запутался я
если неделя начинается в понедельник то воскресенье +6

Код: plsql
1.
2.
3.
4.
5.
6.
  1* select date '2017-05-01'+6 from dual
SQL> /

DATE'201
--------
07.05.17




если я Вас понимаю, то greatest нужен для первой недели января

......
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449450
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..Norman94Ваш вариант я использовал в другом месте.

Я уже писал, что в функции которая ищет отпуска по интервалам надо сделать - начало - 1 число недели, конец - воскресенье последней недели отпуска. В этом посту 20460027 юзер привёл отличный пример, но к его подсчётам у меня не получается прикрутить greatest. Точнее, прикрутить получилось, но всё задание слито на корню. А до greatest всё работало как надо.
запутался я
если неделя начинается в понедельник то воскресенье +6

Код: plsql
1.
2.
3.
4.
5.
6.
  1* select date '2017-05-01'+6 from dual
SQL> /

DATE'201
--------
07.05.17





если я Вас понимаю, то greatest нужен для первой недели января

......
stax

Не только для первого января, но и чтобы он года различал. Для 2017 он всё выводит как надо. Например я поставил О для 3 недель в 2017 и 2016. В 2017 всё правильно - с 8 мая до 4 июня.

Для 2016 вообще треш - 7 мая по 3 июня. Это не правильно.

Пожалуйста, скажите, как грамотно применить greatest для этих строк

Код: sql
1.
2.
 to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon') End_week
...
Рейтинг: 0 / 0
Дни отпуска
    #39449462
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..пропущено...

запутался я
если неделя начинается в понедельник то воскресенье +6

Код: plsql
1.
2.
3.
4.
5.
6.
  1* select date '2017-05-01'+6 from dual
SQL> /

DATE'201
--------
07.05.17





если я Вас понимаю, то greatest нужен для первой недели января

......
stax

Не только для первого января, но и чтобы он года различал. Для 2017 он всё выводит как надо. Например я поставил О для 3 недель в 2017 и 2016. В 2017 всё правильно - с 8 мая до 4 июня.

Для 2016 вообще треш - 7 мая по 3 июня. Это не правильно.

Пожалуйста, скажите, как грамотно применить greatest для этих строк

Код: sql
1.
2.
 to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon') End_week



почти Ваша тема
Определить дату по номеру недели если первая неделя - неделя с первым четвергом года


если для 2016 года выводится неправильно, надо найти причину,
я не могу понять зачем Вам greatest для конца інтервала



авторДля 2016 вообще треш - 7 мая по 3 июня. Это не правильно.


ето для какой недели? и как правильно?

......
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449465
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..Norman94пропущено...


Не только для первого января, но и чтобы он года различал. Для 2017 он всё выводит как надо. Например я поставил О для 3 недель в 2017 и 2016. В 2017 всё правильно - с 8 мая до 4 июня.

Для 2016 вообще треш - 7 мая по 3 июня. Это не правильно.

Пожалуйста, скажите, как грамотно применить greatest для этих строк

Код: sql
1.
2.
 to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon') End_week




почти Ваша тема
Определить дату по номеру недели если первая неделя - неделя с первым четвергом года


если для 2016 года выводится неправильно, надо найти причину,
я не могу понять зачем Вам greatest для конца інтервала



авторДля 2016 вообще треш - 7 мая по 3 июня. Это не правильно.


ето для какой недели? и как правильно?

......
stax

Ну когда я ставлю greatest, он мало того, что считает с 1 января, так ещё и даты других годов учитывает.

Это с 19-22 неделю. И правильнее будет не 7 мая по 3 июня
А со 2 по 29 мая
...
Рейтинг: 0 / 0
Дни отпуска
    #39449466
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как мне нужно изменить те строчки, чтобы выводилось как надо? Или что надо поменять в функции вообще?

Код: sql
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.
create or replace FUNCTION
 week_fun200(i_code IN INTEGER, i_year in integer)
RETURN VARCHAR2 IS
l_list VARCHAR2(32767);
 l_res VARCHAR2(4000);
 BEGIN SELECT listagg(column_name,',') WITHIN GROUP(ORDER BY to_char(
                greatest(
                   trunc (to_date(i_year||'0101', 'yyyymmdd')+((LTRIM(column_name,'N'))-1)*7, 'iw')
                 ,to_date(i_year||'0101', 'yyyymmdd'))
             ,'dd mon'))
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';
   l_list:='with t2 as(
  select God, Kod_sotr,'||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year)'||
  q'~
  select /* God, Kod_sotr, */ listagg(lag_WN) within group (order by RN,Kod_sotr) vacation 
from (
select rownum RN, Kod_sotr,Week_Number,vacation,
case when ((lead(Week_Number,1,100) over(PARTITION by Kod_sotr order by Kod_sotr)- Week_number )>1) and 
          ((Week_number - lag(Week_Number,1,-1) over(PARTITION by Kod_sotr order by Kod_sotr)) > 1 )  then Begin_Week||'-'||End_week||'; '
          
     when lead(Week_Number,1,100) over(PARTITION by Kod_sotr order by Kod_sotr) - Week_number > 1 then End_week||'; '
     when Week_number - lag(Week_Number,1,-1) over(PARTITION by Kod_sotr order by Kod_sotr) > 1 then Begin_Week||'-'
     else null end lag_WN
         from (
                select Kod_sotr, Vacation, to_number(ltrim(weeks,'N')) Week_Number,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon') End_week
                from t2
                unpivot (vacation for weeks in (~'||l_list||q'~))
                order by Kod_sotr, to_number(ltrim(weeks,'N'))
              )where vacation='о'
order by Kod_sotr, Week_Number
)
group by Kod_sotr~';
   EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
  RETURN RTRIM(l_res);
  END;
...
Рейтинг: 0 / 0
Дни отпуска
    #39449479
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

Мне кажется Вы всех запутали и себя в первую очередь
вот это я Вам предложил когда вы сказали что во ВСЕХ годах первая неделя это 01.01-07.01
Код: plsql
1.
to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,



Сейчас вы пишите что неделя ДОЛЖНА зависеть от года: то есть ПЕРВАЯ неделя 2017 это 01.01-01.01 - т.к. первая неделя года была воскресенье только.

Определитесь на листочке ЧТО вы хотите видеть и изложите с листочка проблему, а не фразами 18 неделя не правильно определилась, тут мало кто будет 18 высчитывать. Для первой - второй определитесь.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449482
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Ну когда я ставлю greatest, он мало того, что считает с 1 января, так ещё и даты других годов учитывает.

Это с 19-22 неделю. И правильнее будет не 7 мая по 3 июня
А со 2 по 29 мая

Ваша ф-ция считает начало первой недели 01 января
вторая неделя начинается с 08 января (не с понедельника)

to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1 ,'dd mon') Begin_Week,
to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +7 ,'dd mon') End_week


1) зачем плюс 1 я не знаю
2) +7 ето начало след недели, а не конец

greatest сдесь нипричем, ф-ция (выражение) по другому считает недели

сравните с trunc (to_date(god||'0101', 'yyyymmdd')+(weeks-1)*7, 'iw')

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449483
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Да, во всех годах первая неделя (и да, в 2017 это 1 неделя - это 1 января, так правильно), но при этом надо, чтобы он недели показывал в соответствии с их положение в году! То есть как я уже написал выше я ставлю О (то есть отпуск) в 18-21 неделе. В 2017 году - он должен вывести (и выводит!) 8 мая - 4 июн. Это правильно. Однако теперь я в таблице ставлю О для 2016 года, именно на тех неделях. И он должен вывести не с 7 по 3 июня, а 2 по 29 мая. Для 2015 это уже будут другие числа.

Я так пытался сделать с помщью greatest, но.. Не выходит.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449484
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..1) зачем плюс 1 я не знаю
2) +7 ето начало след недели, а не конец


.....
stax

Когда их не было, он считал 1 числа недели не за понедельник, а за воскресенье.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449487
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..
1) зачем плюс 1 я не знаю
2) +7 ето начало след недели, а не конец

.....
stax
звиняюсь

запутался я, надо +1 и соответственно +1+6=7


ps
также не понимаю зачем Вам столько ф-ций,
одной ж достаточно, добавив парамер "тип отпуска" (о,у,к ...)

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449489
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..ps
также не понимаю зачем Вам столько ф-ций,
одной ж достаточно, добавив парамер "тип отпуска" (о,у,к ...)

.....
stax
Ну я так и сделаю)
...
Рейтинг: 0 / 0
Дни отпуска
    #39449493
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..1) зачем плюс 1 я не знаю
2) +7 ето начало след недели, а не конец


.....
stax

Когда их не было, он считал 1 числа недели не за понедельник, а за воскресенье.

не так,
Вам просто повезло что 2017 начинался в воскресенье

......
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449495
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXLNorman94,

Мне кажется Вы всех запутали и себя в первую очередь
вот это я Вам предложил когда вы сказали что во ВСЕХ годах первая неделя это 01.01-07.01
Код: plsql
1.
to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,




Сейчас вы пишите что неделя ДОЛЖНА зависеть от года: то есть ПЕРВАЯ неделя 2017 это 01.01-01.01 - т.к. первая неделя года была воскресенье только.

Определитесь на листочке ЧТО вы хотите видеть и изложите с листочка проблему, а не фразами 18 неделя не правильно определилась, тут мало кто будет 18 высчитывать. Для первой - второй определитесь.

Извините, я опять запутал. Вот как надо.

В любом году 1 неделя начинается с 1 января. В 2017 году - 1 неделя - это 1 января, вторая 2-8 и т.д. В 2016 1 неделя - 1 января - 3 января и т.д. При этом положение недель (то есть первые числа недели) должны быть в соответствии с оным в году. Как я уже написал выше с маем.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449497
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Да, поэтому я пытаюсь привязать greatest, но не выходит.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449506
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

Код: plsql
1.
2.
3.
4.
5.
6.
select trunc(add_months(trunc(sysdate, 'yyyy'), 12 * (level - 1)), 'iw')
      ,greatest(trunc(add_months(trunc(sysdate, 'yyyy'), 12 * (level - 1)), 'iw'),
                add_months(trunc(sysdate, 'yyyy'), 12 * (level - 1)))
      ,trunc(add_months(trunc(sysdate, 'yyyy'), 12 * (level - 1)), 'iw') + 6
from   dual
connect by level < 5
...
Рейтинг: 0 / 0
Дни отпуска
    #39449507
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..,

Да, поэтому я пытаюсь привязать greatest, но не выходит.

20460313

еще раз
greatest нужен для "первой" недели, шоб получіть первое января

для того чтоб неделя начиналась с понедельника надо trunc(xxx,'iw')

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449508
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..1) зачем плюс 1 я не знаю
2) +7 ето начало след недели, а не конец


.....
stax

Когда их не было, он считал 1 числа недели не за понедельник, а за воскресенье.

Какой день недели считать первым зависит от параметра NLS_TERRITORY
...
Рейтинг: 0 / 0
Дни отпуска
    #39449510
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123ййNorman94,

Код: plsql
1.
2.
3.
4.
5.
6.
select trunc(add_months(trunc(sysdate, 'yyyy'), 12 * (level - 1)), 'iw')
      ,greatest(trunc(add_months(trunc(sysdate, 'yyyy'), 12 * (level - 1)), 'iw'),
                add_months(trunc(sysdate, 'yyyy'), 12 * (level - 1)))
      ,trunc(add_months(trunc(sysdate, 'yyyy'), 12 * (level - 1)), 'iw') + 6
from   dual
connect by level < 5



Хорошо, намёк я понял, а как мне в эти строки всё подстроить?

Код: sql
1.
2.
to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon') End_week
...
Рейтинг: 0 / 0
Дни отпуска
    #39449512
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..Norman94stax..,

Да, поэтому я пытаюсь привязать greatest, но не выходит.

20460313

еще раз
greatest нужен для "первой" недели, шоб получіть первое января

для того чтоб неделя начиналась с понедельника надо trunc(xxx,'iw')

.....
stax

Но даже если не обращать внимания на greatest, как мне заставить эти строчки считать числа интервалов в зависимости от года? как?
...
Рейтинг: 0 / 0
Дни отпуска
    #39449515
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXLNorman94пропущено...


Когда их не было, он считал 1 числа недели не за понедельник, а за воскресенье.

Какой день недели считать первым зависит от параметра NLS_TERRITORY

Это как то можно сюда вставить?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
from (
                select Kod_sotr, Vacation, to_number(ltrim(weeks,'N')) Week_Number,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon') End_week
                from t2
                unpivot (vacation for weeks in (~'||l_list||q'~))
                order by Kod_sotr, to_number(ltrim(weeks,'N'))
              )where vacation='о'
order by Kod_sotr, Week_Number
)
...
Рейтинг: 0 / 0
Дни отпуска
    #39449516
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот пример из другой функции. Здесь считает и о 1 января, и недели у него начинаются как должны начинаться в определённом году

Код: sql
1.
2.
3.
4.
5.
6.
SELECT listagg('CASE WHEN '||column_name||' IN(''у'') THEN '||''''||
             to_char(
                greatest(
                   trunc (to_date(i_year||'0101', 'yyyymmdd')+((LTRIM(column_name,'N'))-1)*7, 'iw')
                  ,to_date(i_year||'0101', 'yyyymmdd'))
             ,'dd mon')||''''|| '||''; '' ELSE NULL END ' ,'||')



Как мне здесь подобное изобразить?

Код: sql
1.
2.
 to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon') End_week
...
Рейтинг: 0 / 0
Дни отпуска
    #39449519
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Хорошо, намёк я понял, а как мне в эти строки всё подстроить
если, почти за два месяца, не можешь решить задачу, то за 5 мин тебе ее не объяснить.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449524
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Хорошо, намёк я понял

Я понял - это намёк, я всё ловлю на лету, но непонятно, что конкретно ты имело в виду?

Это курсовая или тебе платят за время проведённое над задачей, а не за результат?
Убери руки от клавиатуры и сформулируй свою задачу на бумаге так, чтобы ты мог её объяснить 12-летнему ребёнку. пока не получится - клавиатуру не трогай.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449525
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

Я уже написал всю задачу ниже. Ещё раз, чётко и перефразировано.
...
Рейтинг: 0 / 0
Дни отпуска
    #39449535
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Вот пример из другой функции. Здесь считает и о 1 января, и недели у него начинаются как должны начинаться в определённом году

Код: sql
1.
2.
3.
4.
5.
6.
SELECT listagg('CASE WHEN '||column_name||' IN(''у'') THEN '||''''||
             to_char(
                greatest(
                   trunc (to_date(i_year||'0101', 'yyyymmdd')+((LTRIM(column_name,'N'))-1)*7, 'iw')
                  ,to_date(i_year||'0101', 'yyyymmdd'))
             ,'dd mon')||''''|| '||''; '' ELSE NULL END ' ,'||')



Как мне здесь подобное изобразить?

Код: sql
1.
2.
 to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon') End_week

Код: plsql
1.
2.
3.
4.
5.
6.
7.
to_char(
                greatest(
                   trunc (
                        trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1
                            'iw')
                  ,to_date(i_year||'0101', 'yyyymmdd'))
,'dd mon') Begin_Week,



.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449545
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Ещё раз, чётко и перефразировано.

Не нашёл.


Пока что общение идёт строго в духе :

Задача ТС - построить будку собаке.

ТС: Я слышал, что небоскрёбы можно строить из дерева [spoiler - на самом деле можно], поэтому я взял сосновую вагонку, осиновые колышки и ивовую кору, чтобы их связывать. Как связать колышек с доской, если у меня кора выскальзывает из рук?
Форумчане: Что ты хочешь построить? Может стоит использовать кирпич или брёвна?
Форумчане: В принципе, можно натереть руки песком, тогда кора будет меньше выскальзывать!
ТС: "Что ты хочешь построить?" Я же сказал, я хочу связать доски с колышками! Корой! И от песка она уже почти не выскальзывает! Как мне теперь первые доски связать колышками?!
...
Рейтинг: 0 / 0
Дни отпуска
    #39449551
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envNorman94Ещё раз, чётко и перефразировано.

Не нашёл.



20461264

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39449579
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..Norman94Вот пример из другой функции. Здесь считает и о 1 января, и недели у него начинаются как должны начинаться в определённом году

Код: sql
1.
2.
3.
4.
5.
6.
SELECT listagg('CASE WHEN '||column_name||' IN(''у'') THEN '||''''||
             to_char(
                greatest(
                   trunc (to_date(i_year||'0101', 'yyyymmdd')+((LTRIM(column_name,'N'))-1)*7, 'iw')
                  ,to_date(i_year||'0101', 'yyyymmdd'))
             ,'dd mon')||''''|| '||''; '' ELSE NULL END ' ,'||')



Как мне здесь подобное изобразить?

Код: sql
1.
2.
 to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon') End_week

Код: plsql
1.
2.
3.
4.
5.
6.
7.
to_char(
                greatest(
                   trunc (
                        trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1
                            'iw')
                  ,to_date(i_year||'0101', 'yyyymmdd'))
,'dd mon') Begin_Week,



.....
stax

Я так уже пробовал. Выпадает ошибка missing right parenthesis
...
Рейтинг: 0 / 0
Дни отпуска
    #39449584
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
envNorman94Ещё раз, чётко и перефразировано.

Не нашёл.


Пока что общение идёт строго в духе :

Задача ТС - построить будку собаке.

ТС: Я слышал, что небоскрёбы можно строить из дерева [spoiler - на самом деле можно], поэтому я взял сосновую вагонку, осиновые колышки и ивовую кору, чтобы их связывать. Как связать колышек с доской, если у меня кора выскальзывает из рук?
Форумчане: Что ты хочешь построить? Может стоит использовать кирпич или брёвна?
Форумчане: В принципе, можно натереть руки песком, тогда кора будет меньше выскальзывать!
ТС: "Что ты хочешь построить?" Я же сказал, я хочу связать доски с колышками! Корой! И от песка она уже почти не выскальзывает! Как мне теперь первые доски связать колышками?!

Имеется таблица Отпуска со столбцами код сотрудника, год и 53 столбца, обозначающих недели в году. Выглядят как N1, N2 и т.д. Есть длинная динамическая функция (спасибо юзеру Максим), который динамически пробегает по столцам и вытаскивает только те, что имеют значения "о" (то есть отпуск). Причём, вытаскивает первую и последнюю неделю. Так же названия столбцов переименованы в числа и месяца в году в соответствии с положением недели. Однако нужно чтобы:

1. Если интервал - то начало - это число начала недели, а конец - воскресенье последней недели.
2. Нужно, чтобы выводились даты в соответствии с их годами. Например столбцы 19-22 в 2017 году - это 8 мая - 4 июня, а в 2016 году - 2 мая - 29 мая.

Вот длинная функция. Здесь реализован лишь первый пункт, но только для 2017 года. А для последующих или предыдущих он выводит неверные даты.

Код: sql
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.
create or replace FUNCTION
 week_fun200(i_code IN INTEGER, i_year in integer)
RETURN VARCHAR2 IS
l_list VARCHAR2(32767);
 l_res VARCHAR2(4000);
 BEGIN SELECT listagg(column_name,',') WITHIN GROUP(ORDER BY to_char(
                greatest(
                   trunc (to_date(i_year||'0101', 'yyyymmdd')+((LTRIM(column_name,'N'))-1)*7, 'iw')
                 ,to_date(i_year||'0101', 'yyyymmdd'))
             ,'dd mon'))
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';
   l_list:='with t2 as(
  select God, Kod_sotr,'||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year)'||
  q'~
  select /* God, Kod_sotr, */ listagg(lag_WN) within group (order by RN,Kod_sotr) vacation 
from (
select rownum RN, Kod_sotr,Week_Number,vacation,
case when ((lead(Week_Number,1,100) over(PARTITION by Kod_sotr order by Kod_sotr)- Week_number )>1) and 
          ((Week_number - lag(Week_Number,1,-1) over(PARTITION by Kod_sotr order by Kod_sotr)) > 1 )  then Begin_Week||'-'||End_week||'; '
          
     when lead(Week_Number,1,100) over(PARTITION by Kod_sotr order by Kod_sotr) - Week_number > 1 then End_week||'; '
     when Week_number - lag(Week_Number,1,-1) over(PARTITION by Kod_sotr order by Kod_sotr) > 1 then Begin_Week||'-'
     else null end lag_WN
         from (
                select Kod_sotr, Vacation, to_number(ltrim(weeks,'N')) Week_Number,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7 +1,'dd mon') Begin_Week,
                to_char(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7+7,'dd mon') End_week
                from t2
                unpivot (vacation for weeks in (~'||l_list||q'~))
                order by Kod_sotr, to_number(ltrim(weeks,'N'))
              )where vacation='о'
order by Kod_sotr, Week_Number
)
group by Kod_sotr~';
   EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
  RETURN RTRIM(l_res);
  END;



Помогите реализовать 2 пункт, пожалуйста.
...
Рейтинг: 0 / 0
Дни отпуска
    #39450031
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

Не хотите Вы включать мозг, как бы Вас тут не просили на протяжении почти 3 месяцев
Я в Вашем коде не видел НИ ОДНОГО комментария (для себя любимого) не думаете а КАК оно работает ... а отвечаете в виде "а как мне подставить в мой недокод и сдать" Вы через неделю ту же задачу со смещением в 1 день не сможете написать, потому что это для Вас это магия, в которой Вам дали в руки маг полочку и сказали одно заклинание хотя пытались объяснить как эти заклинания строить.

Вот Вам код, который должен выполнить то что сказал преподаватель, сдайте и забудьте ...

Код: plsql
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.
with t2 as(
select '2017' god, '1' kod_sort, 'o' N1, null N2, 'o' N3, 'o' N4, null N5, null N6, 'o' N7, 'o' N8, 'o' N9, 'o' N10, null N11 from dual union all
select '2017' god, '2' kod_sort, null N1, 'o' N2, 'o' N3, 'o' N4, null N5, 'o' N6, 'o' N7, 'o' N8, 'o' N9, 'o' N10, null N11 from dual union all
select '2017' god, '3' kod_sort, 'o' N1, 'o' N2, 'o' N3, 'o' N4, null N5, null N6, 'o' N7, 'o' N8, 'o' N9, null N10, null N11 from dual union all
select '2017' god, '4' kod_sort, 'o' N1, null N2, 'o' N3, 'o' N4, null N5, null N6, 'o' N7, 'o' N8, 'o' N9, 'o' N10, null N11 from dual)

select  Kod_Sort, listagg(lag_WN) within group (order by RN,kod_sort) vacation 
from (
select rownum RN, Kod_Sort,Week_Number,vacation,

case when ((lead(Week_Number,1,100) over(PARTITION by Kod_Sort order by Kod_Sort)- Week_number )>1) and 
          ((Week_number - lag(Week_Number,1,-1) over(PARTITION by Kod_Sort order by Kod_Sort)) > 1 )  then Begin_Week||'-'||End_week||'; '
          
     when lead(Week_Number,1,100) over(PARTITION by Kod_Sort order by Kod_Sort) - Week_number > 1 then End_week||'; '
     when Week_number - lag(Week_Number,1,-1) over(PARTITION by Kod_Sort order by Kod_Sort) > 1 then Begin_Week||'-'
     else null end lag_WN
         from (
                select Kod_Sort, Vacation, to_number(ltrim(weeks,'N')) Week_Number,
                to_char(
                 greatest(
                  trunc(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7,'iw'),
                  to_date('0101'||god,'ddmmyyyy')
                 )  
                ,'dd mon') Begin_Week,
                to_char(
                 least(
                  trunc(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7,'iw')+6,
                  to_date('3112'||god,'ddmmyyyy')
                 )
                ,'dd mon') End_week
                from t2
                unpivot (vacation for weeks in (N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11))
                order by Kod_Sort, to_number(ltrim(weeks,'N'))
              )
order by Kod_Sort, Week_Number
)
group by Kod_Sort
...
Рейтинг: 0 / 0
Дни отпуска
    #39450235
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Спасибо Вам! На самом деле мне реально интересно как оно работает, я даже спрашивал у вас об этом страницы 2 назад) Правда, расскажите пожалуйста.
...
Рейтинг: 0 / 0
Дни отпуска
    #39450252
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL
Код: plsql
1.
(PARTITION by Kod_Sort order by Kod_Sort)

Говнокодец.
...
Рейтинг: 0 / 0
Дни отпуска
    #39450542
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

он идет корнями в прошлое, месяца 2 назад =)

раньше было
Код: plsql
1.
PARTITION by God order by Kod_sotr



но тогда я God перевел как Бог/Идол и подумаю что там храняться идентификаторы клиентов т.к. никогда не пользовал названия полей в транслите.

потом осознав "свою" ошибку хотел переписать но увидел КАК его используют
Код: plsql
1.
2.
with t2 as(
  select God, Kod_sotr,'||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year)



т.е. на вход идет таблица из 1 записи .... я немного растроился и в очередную правку просто выкинул нечитабельное (раздражаемое) поле God
...
Рейтинг: 0 / 0
Дни отпуска
    #39450549
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLраньше былоА как же rt-tr?

И зачем повышать энтропию?
...
Рейтинг: 0 / 0
Дни отпуска
    #39450574
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

Неужели ты наконец-то согласился на запрос без динамики? Свершилось..
...
Рейтинг: 0 / 0
Дни отпуска
    #39450585
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,



Код: plsql
1.
2.
3.
....
EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
....



....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39450587
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envNorman94,

Неужели ты наконец-то согласился на запрос без динамики? Свершилось..

Нет, он его потом в динамику переписывает


ElicА как же rt-tr?

И зачем повышать энтропию?

согласен, тогда правильнее так:

Код: plsql
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.
with t2 as(
select '2017' god, '1' kod_sort, 'o' N1, null N2, 'o' N3, 'o' N4, null N5, null N6, 'o' N7, 'o' N8, 'o' N9, 'o' N10, null N11 from dual union all
select '2017' god, '2' kod_sort, null N1, 'o' N2, 'o' N3, 'o' N4, null N5, 'o' N6, 'o' N7, 'o' N8, 'o' N9, 'o' N10, null N11 from dual union all
select '2017' god, '3' kod_sort, 'o' N1, 'o' N2, 'o' N3, 'o' N4, null N5, null N6, 'o' N7, 'o' N8, 'o' N9, null N10, null N11 from dual union all
select '2017' god, '4' kod_sort, 'o' N1, null N2, 'o' N3, 'o' N4, null N5, null N6, 'o' N7, 'o' N8, 'o' N9, 'o' N10, null N11 from dual)

select  Kod_Sort, listagg(lag_WN) within group (order by RN,kod_sort) vacation 
from (
select rownum RN, Kod_Sort,Week_Number,vacation,

case when ((lead(Week_Number,1,100) over(PARTITION by Kod_Sort, God order by Week_Number)- Week_number )>1) and 
          ((Week_number - lag(Week_Number,1,-1) over(PARTITION by Kod_Sort, God order by Week_Number)) > 1 )  then Begin_Week||'-'||End_week||'; '
          
     when lead(Week_Number,1,100) over(PARTITION by Kod_Sort, God order by Week_Number) - Week_number > 1 then End_week||'; '
     when Week_number - lag(Week_Number,1,-1) over(PARTITION by Kod_Sort, God order by Week_Number) > 1 then Begin_Week||'-'
     else null end lag_WN

         from (
                select Kod_Sort, God, Vacation, to_number(ltrim(weeks,'N')) Week_Number,
                to_char(
                 greatest(
                  trunc(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7,'iw'),
                  to_date('0101'||god,'ddmmyyyy')
                 )  
                ,'dd mon') Begin_Week,
                to_char(
                 least(
                  trunc(trunc(to_date(god,'yyyy'),'y')+(to_number(ltrim(weeks,'N'))-1)*7,'iw')+6,
                  to_date('3112'||god,'ddmmyyyy')
                 )
                ,'dd mon') End_week
                from t2
                unpivot (vacation for weeks in (N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11))
                order by Kod_Sort, to_number(ltrim(weeks,'N'))
              )
order by Kod_Sort, Week_Number
)
group by Kod_Sort
...
Рейтинг: 0 / 0
Дни отпуска
    #39450629
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав, я про 20466230 и предшествующее

ТС даже не заикнулся, как обычно раньше, что ему нужна динамика.
...
Рейтинг: 0 / 0
Дни отпуска
    #39450634
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав, а также сравни с предложенным ещё в марте 20305014
...
Рейтинг: 0 / 0
Дни отпуска
    #39450641
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

Вот тебе от 5 мая =)) 20459931 и 20459997

Он уверено идет в динамику
...
Рейтинг: 0 / 0
Дни отпуска
    #39450667
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envСтанислав, а также сравни с предложенным ещё в марте 20305014
та я уже не знаю, что и сравнивать
Вариантов предложили массу
Тут вопрос скорее к преподавателю, мож он хочет заставить Нормана разобраться в запятих


ps
я яж теперь понял что ето лаба
......
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39454275
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax, пожалуйста, объясните подробнее эти строки. Мне чисто интересно узнать что в них происходит

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
w as ( --номеруем для поиска непрырывных
 select
   u.*
--  ,trunc (to_date(god||'0101', 'yyyymmdd') + (weeks-1)*7, 'ww') d
    ,greatest(
     trunc (to_date(god||'0101', 'yyyymmdd')+(weeks-1)*7, 'iw')
     ,to_date(god||'0101', 'yyyymmdd')) d
  ,row_number() over (order by weeks) rn
 from u
 where vacation=:o)
...
Рейтинг: 0 / 0
Дни отпуска
    #39454354
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax, пожалуйста, объясните подробнее эти строки. Мне чисто интересно узнать что в них происходит

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
w as ( --номеруем для поиска непрырывных
 select
   u.*
--  ,trunc (to_date(god||'0101', 'yyyymmdd') + (weeks-1)*7, 'ww') d
    ,greatest(
     trunc (to_date(god||'0101', 'yyyymmdd')+(weeks-1)*7, 'iw')
     ,to_date(god||'0101', 'yyyymmdd')) d
  ,row_number() over (order by weeks) rn
 from u
 where vacation=:o)



1) u.* берем все поля із u, наслидок моего лентяйства, правильно перечислять нужные поля

2)іщем понедельник (передыдущий понедельник)
trunc (to_date(god||'0101', 'yyyymmdd')+(weeks-1)*7, 'iw')
Код: plsql
1.
2.
3.
4.
5.
SQL> select to_char(trunc (date '2018-01-01','iw'),'dd.mm.yyyy day') d from dual;

D
--------------------
01.01.2018 понеділок


но
Код: plsql
1.
2.
3.
4.
5.
SQL> select to_char(trunc (date '2017-01-01','iw'),'dd.mm.yyyy day') d from dual;

D
--------------------
26.12.2016 понеділок


но год вам Вам не подходит, поетому плевать на понедельник
берем влоб первое число to_date(god||'0101', 'yyyymmdd')

начиная со второй недели, надо всегда брать понедельники
большую из дат (первое января и что там получится от Nxx) поетому greatest(

3) номеруем (можно было отсортировать и rownum)
,row_number() over (order by weeks) rn
будет использоваться для поиска непрырывных интервалов (с хх по уу)

где-то так
если что-то непонятно написал, спрашивайте, исправлюсь

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39454367
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Ага, интересно. Но всё таки почему вы два раза d объявляете?

Код: sql
1.
2.
3.
4.
,trunc (to_date(god||'0101', 'yyyymmdd') + (weeks-1)*7, 'ww') d
    ,greatest(
     trunc (to_date(god||'0101', 'yyyymmdd')+(weeks-1)*7, 'iw')
     ,to_date(god||'0101', 'yyyymmdd')) d



А про эти строки расскажите поподробнее, пожалуйста

Код: sql
1.
2.
3.
4.
5.
6.
7.
select
 listagg(to_char(min(d),'dd Mon')||':'||
     to_char(least(add_months(trunc(min(d),'y'),12)-1,trunc(max(d)+7,'iw')-1),'dd Mon'),'; ')
 within group (order by min(d)) res
from w
group by god,kod_sotr,d-rn*7
]';
...
Рейтинг: 0 / 0
Дни отпуска
    #39454376
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Но всё таки почему вы два раза d объявляете?
Norman94
Код: sql
1.
2.
3.
4.
--  ,trunc (to_date(god||'0101', 'yyyymmdd') + (weeks-1)*7, 'ww') d
    ,greatest(
     trunc (to_date(god||'0101', 'yyyymmdd')+(weeks-1)*7, 'iw')
     ,to_date(god||'0101', 'yyyymmdd')) d


комментарий
...
Рейтинг: 0 / 0
Дни отпуска
    #39454378
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

А точно, понял)
...
Рейтинг: 0 / 0
Дни отпуска
    #39454407
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..,

А про эти строки расскажите поподробнее, пожалуйста

Код: sql
1.
2.
3.
4.
5.
6.
7.
select
 listagg(to_char(min(d),'dd Mon')||':'||
     to_char(least(add_months(trunc(min(d),'y'),12)-1,trunc(max(d)+7,'iw')-1),'dd Mon'),'; ')
 within group (order by min(d)) res
from w
group by god,kod_sotr,d-rn*7
]';



1)
min(d) -начало интервала
max(d)- конец интервала
trunc(min(d),'y') первое января
add_months(trunc(min(d),'y'),12) -первое января след года
-1 -31 декабря текущего года
trunc(max(d)+7,'iw') следующ понедельник
-1 след возкресенье
least мінімальное между 31 декабря и вычисленной датой (шоб интервал не оканчивался в первую неделю след года)
to_char выводим токо день и месяц
listagg в строку разделитель ;
within group (order by min(d)) сортіруем по началу интервала


2) from w -из подготовленной выше для наглядности "вюшки"

3)group by god,kod_sotr,d-rn*7
god,kod_sotr лишнее, осталось от прямого селекта
d-rn*7 для групировки, интервал меджду соседними/непрерывными записями 7 дней

.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39454418
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Спасибо!) Значит получается именно в этой строке идет и вычисление понедельника до воскресенья? А так же разделение по интервалам?
...
Рейтинг: 0 / 0
Дни отпуска
    #39454507
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..,

Спасибо!) Значит получается именно в этой строке идет и вычисление понедельника до воскресенья? А так же разделение по интервалам?
не понял вопрос, в какой строке?
вычисление понедельника усложнено из-за начала года (понедельник для N01 в предыдущем году)
вычисление воскресеннья усложнено із-за конца года (для n52/53 воскресенье может быть в следующем году)

"непрырывные интервалы" получаю с помощью group by (интервал 7дней)

......
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39454516
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offtop

stax..из-за
із-за

Станислав, а в каких случаях правильно писать "и", а в каких "i"?
...
Рейтинг: 0 / 0
Дни отпуска
    #39454543
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envofftop

stax..из-за
із-за

Станислав, а в каких случаях правильно писать "и", а в каких "i"?
в любом случаи правильно из-за (не уверен в черточке, но "і" ето от украинского, обычно после переключения на латиницу)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> ed
Wrote file afiedt.buf

  1* select ascii('і') i from dual
SQL> /

         I
----------
       179



у меня и так плохая реакция на переключение раскладки, а тут еще привыкаю переключать правыми shift/ctrl из-за новеловского месседжера



ps
если есть возможность игнорите очепятки, я понимаю что раздражает, и я стараюсь, но часто злоупотребляю халатностью (спешка)
.....
stax
...
Рейтинг: 0 / 0
Дни отпуска
    #39454610
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Всё, понял, спасибо ещё раз!)
...
Рейтинг: 0 / 0
Дни отпуска
    #39454640
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94stax..,

Всё, понял, спасибо ещё раз!)
незачто, спрашивайте, если знаю предложу свой вариант, иногда неверный

но!, не всегда есть время, охота, инет, настроение и тд

.....
stax
...
Рейтинг: 0 / 0
156 сообщений из 156, показаны все 7 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Дни отпуска
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]