powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Дни отпуска
25 сообщений из 156, страница 6 из 7
Дни отпуска
    #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
25 сообщений из 156, страница 6 из 7
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Дни отпуска
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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