powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Преобразование значений в дату
25 сообщений из 65, страница 1 из 3
Преобразование значений в дату
    #39422847
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Имеется огромная таблица График с кодом сотрудника, годом и 52 столбцами N1, N2 и т.д., характеризующими недели. В значениях этих недель находятся символьные значения о, у, которые обозначают вид отпуска.

У меня есть функция, которая динамически проходит по столбцам и вытаскивает только те, в которых есть обозначение о, причём именно интервалами, то есть первую неделю интервала и последнюю.

На выходе функция выдаёт (N1, N5; N10, N11), но мне нужно, чтобы выводилось как (01.01, 28.01), то есть выдавал число и месяц начала недели заместо N.

Я пытался вставить этот момент в готовую функцию

Оригинальная функция выглядит так:

Код: 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.
create or replace FUNCTION
 week_fun1(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 1)
 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||';'
      when lead(Week_Number) over(PARTITION by God order by Kod_sotr) is null then Weeks||';'
       when lag(Week_Number) over(PARTITION by God order by Kod_sotr) is null then Weeks||','
       when Week_number - lag(Week_Number) over(PARTITION by God order by Kod_sotr) > 1 then Weeks||','
       else null end lag_WN
          from (
                   select God, Kod_sotr, weeks, 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;


А с расчётом - так:
Код: 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.
create or replace FUNCTION
 week_fun1(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_number(LTRIM(column_name,'N')))
 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||';'
      when lead(Week_Number) over(PARTITION by God order by Kod_sotr) is null then Weeks||';'
       when lag(Week_Number) over(PARTITION by God order by Kod_sotr) is null then Weeks||','
       when Week_number - lag(Week_Number) over(PARTITION by God order by Kod_sotr) > 1 then Weeks||','
       else null end lag_WN
          from (
                   select God, Kod_sotr, weeks, Vacation, cast(to_char( trunc (to_date(~'||i_year||q'~||'0101', 'yyyymmdd') 
+ ((LTRIM(weeks,'N'))-1)*7, 'ww'), 'dd.mm')as number) Week_Number from t2
                  unpivot (vacation for weeks in (~'||l_list||q'~))
                 order by God, Kod_sotr, cast(to_char( trunc (to_date(~'||i_year||q'~||'0101', 'yyyymmdd') 
+ ((LTRIM(weeks,'N'))-1)*7, 'ww'), 'dd.mm')as number)
                )
          )group by god, Kod_sotr~';
   EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
  RETURN RTRIM(l_res);
  END;



Но при вызове
Код: plsql
1.
  select week_fun( kod_sotr,god) f from grafik g;


Он выдаёт "неверный номер", и я вообще не понимаю что это значит. Прошу, помогите понять, в чём дело?
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422855
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Прошу, помогите понять, в чём дело?Не надо создавать тыщи тем.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422856
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"неверный номер"

У ошибки есть код и стандартный текст, по которому можно сразу нагуглить информацию.
Запрос выньте из execute immediate, отлаживайте в отдельном SQL-окне.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422859
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Эта тема отличается от той. Но больше не буду.
dmdmdm"неверный номер"

У ошибки есть код и стандартный текст, по которому можно сразу нагуглить информацию.
Запрос выньте из execute immediate, отлаживайте в отдельном SQL-окне.
Бесполезно, он пишет, типа Указан недопустимый номер, но это странно, учитывая, что я просто пытаюсь преобразовать численные значения N в дату. В других похожих функциях всё работало.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422952
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Бесполезно

Если нет test case, действительно, разговаривать бесполезно.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422956
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdmNorman94Бесполезно

Если нет test case, действительно, разговаривать бесполезно.

У меня проверок было полно, но что бы я ни делал, у меня не получалось подставлять эту функцию to_char( trunc (to_date(i_year||'0101', 'yyyymmdd')
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd.mm') для того, чтоб преобразовать порядковый номер столбца в дату.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422957
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
cast (to_char(..., 'dd.mm') as number)
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422960
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AnSi_Sr
Код: plsql
1.
cast (to_char(..., 'dd.mm') as number)



Пытался

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
from (
                   select God, Kod_sotr, weeks, Vacation, cast(to_char( trunc (to_date(2017||'0101', 'yyyymmdd') 
+ ((LTRIM(weeks,'N'))-1)*7, 'ww'), 'dd.mm')as number) Week_Number from t2
                  unpivot (vacation for weeks in (~'||l_list||q'~))
                 order by God, Kod_sotr, cast(to_char( trunc (to_date(2017||'0101', 'yyyymmdd') 
+ ((LTRIM(weeks,'N'))-1)*7, 'ww'), 'dd.mm')as number)
                )where vacation='о'
          )group by god, Kod_sotr~';



Пишет invalid number
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422961
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Пишет invalid numberОн ошибается. Ты не number.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422964
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicNorman94Пишет invalid numberОн ошибается. Ты не number.
Грубые вы. Я у вас помощи попросил, а вы начинаете оскорблениями кидаться.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422967
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Пытался
говнокодить так по полной
Код: plsql
1.
cast (to_char(..., 'dd,mm') as number)
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422972
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123ййNorman94Пытался
говнокодить так по полной
Код: plsql
1.
cast (to_char(..., 'dd,mm') as number)



Здорово, теперь он мало того, что он не преобразил ничего, так и абракадабру начал выдавать
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422974
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123ййNorman94Пытался
говнокодить так по полной
Код: plsql
1.
cast (to_char(..., 'dd,mm') as number)
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422976
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnSi_Sr,

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

говнокодить так по полной
Код: plsql
1.
cast (to_char(..., 'dd,mm') as number)




Так же

Код: sql
1.
2.
select God, Kod_sotr, weeks, Vacation, cast(to_char( trunc (to_date(2017||'0101', 'yyyymmdd') 
+ ((LTRIM(weeks,'N'))-1)*7, 'ww'), 'dd,mm')as number) Week_Number from t2
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422981
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94так и абракадабру начал выдавать
за то нет ошибки :)Norman94Пишет invalid number
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422982
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123ййNorman94так и абракадабру начал выдавать
за то нет ошибки :)Norman94Пишет invalid number

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

Код: sql
1.
2.
3.
4.
5.
BEGIN SELECT listagg(to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd.mm'),',') WITHIN GROUP(ORDER BY 1)
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';


При этом снизу я убрал те моменты, где происходило отсеивание столбцов цифр от N

То есть как было:

Код: sql
1.
2.
3.
4.
5.
6.
from (
                   select God, Kod_sotr, weeks, 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~';



И как стало

Код: sql
1.
2.
3.
4.
5.
6.
from (
                   select God, Kod_sotr, weeks, Vacation, cast(weeks as number) Week_Number from t2
                  unpivot (vacation for weeks in (~'||l_list||q'~))
                 order by God, Kod_sotr, cast(weeks as number)
                )where vacation='о'
          )group by god, Kod_sotr~';



Теперь же на этот раз он пишет, что неверный идентификатор, хотя я уже не представляю что ему вообще надо. Никак не получается преобразовать N01 в 1 января (01.01)
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423143
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вывод идёт отсюда с этой строчки
Код: sql
1.
2.
 select /* God, Kod_sotr, */ listagg(ltrim(lag_WN, 'N')) within group (order by RN,Kod_sotr) vacation
  from (



То есть теперь ответ получается без N, что радует. Однако попытавшись туда вставить проклятую формулу для подсчёта даты, он снова пишет invalid number. Помогите пожалуйста разобраться, где я ошибаюсь?

to_char( trunc (to_date(i_year||'0101', 'yyyymmdd')
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd.mm')

Вот формула
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423163
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О сколько нам открытий чудных готовит неявных преобразований типов дух...
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423166
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

То есть? Я вывожу строку, я и компилирую как строку. И в рассчёте идёт преобразование в строку)
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423175
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94То есть? Я вывожу строку, я и компилирую как строку. И в рассчёте идёт преобразование в строку)
аNorman94он снова пишет invalid number
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423178
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123йй,

Блин я запутался(
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423183
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123ййNorman94он снова пишет invalid number
я так понял, теперь он уже пишет "invalid identifier"
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423190
Norman94env,

То есть? Я вывожу строку, я и компилирую как строку. И в рассчёте идёт преобразование в строку)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> select cast(to_char( trunc (to_date(2016||'0101', 'yyyymmdd')
  2  + ((LTRIM('N53','N'))-1)*7, 'ww'), 'dd.mm')as number) from dual;
CAST(TO_CHAR(TRUNC(TO_DATE(201
------------------------------
                         30.12
SQL> alter session ...
Session altered
SQL> select cast(to_char( trunc (to_date(2016||'0101', 'yyyymmdd')
  2  + ((LTRIM('N53','N'))-1)*7, 'ww'), 'dd.mm')as number) from dual;
select cast(to_char( trunc (to_date(2016||'0101', 'yyyymmdd')
+ ((LTRIM('N53','N'))-1)*7, 'ww'), 'dd.mm')as number) from dual

ORA-01722: invalid number


SQL> alter session ...
Session altered
SQL> select cast(to_char( trunc (to_date(2016||'0101', 'yyyymmdd')
  2  + ((LTRIM('N53','N'))-1)*7, 'ww'), 'dd.mm')as number) from dual;
CAST(TO_CHAR(TRUNC(TO_DATE(201
------------------------------
                         30.12
...
Рейтинг: 0 / 0
25 сообщений из 65, страница 1 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Преобразование значений в дату
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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