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


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