Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Преобразование значений в дату / 25 сообщений из 65, страница 1 из 3
20.03.2017, 09:59
    #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
20.03.2017, 10:05
    #39422855
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование значений в дату
Norman94Прошу, помогите понять, в чём дело?Не надо создавать тыщи тем.
...
Рейтинг: 0 / 0
20.03.2017, 10:05
    #39422856
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование значений в дату
"неверный номер"

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

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

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

Если нет test case, действительно, разговаривать бесполезно.
...
Рейтинг: 0 / 0
20.03.2017, 11:16
    #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
20.03.2017, 11:21
    #39422957
AnSi_Sr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование значений в дату
Код: plsql
1.
cast (to_char(..., 'dd.mm') as number)
...
Рейтинг: 0 / 0
20.03.2017, 11:25
    #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
20.03.2017, 11:26
    #39422961
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование значений в дату
Norman94Пишет invalid numberОн ошибается. Ты не number.
...
Рейтинг: 0 / 0
20.03.2017, 11:28
    #39422964
Norman94
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование значений в дату
ElicNorman94Пишет invalid numberОн ошибается. Ты не number.
Грубые вы. Я у вас помощи попросил, а вы начинаете оскорблениями кидаться.
...
Рейтинг: 0 / 0
20.03.2017, 11:30
    #39422967
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование значений в дату
Norman94Пытался
говнокодить так по полной
Код: plsql
1.
cast (to_char(..., 'dd,mm') as number)
...
Рейтинг: 0 / 0
20.03.2017, 11:33
    #39422972
Norman94
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование значений в дату
123ййNorman94Пытался
говнокодить так по полной
Код: plsql
1.
cast (to_char(..., 'dd,mm') as number)



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

*** не дописал сообщение.
Скромно сделал вид, что именно это и имел в виду.
...
Рейтинг: 0 / 0
20.03.2017, 11:35
    #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
20.03.2017, 11:37
    #39422981
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование значений в дату
Norman94так и абракадабру начал выдавать
за то нет ошибки :)Norman94Пишет invalid number
...
Рейтинг: 0 / 0
20.03.2017, 11:37
    #39422982
Norman94
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование значений в дату
123ййNorman94так и абракадабру начал выдавать
за то нет ошибки :)Norman94Пишет invalid number

Ну я не спорю, но проблема то не решена))
...
Рейтинг: 0 / 0
20.03.2017, 12:22
    #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
20.03.2017, 13:18
    #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
20.03.2017, 13:30
    #39423163
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование значений в дату
О сколько нам открытий чудных готовит неявных преобразований типов дух...
...
Рейтинг: 0 / 0
20.03.2017, 13:33
    #39423166
Norman94
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование значений в дату
env,

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

Блин я запутался(
...
Рейтинг: 0 / 0
20.03.2017, 13:42
    #39423183
AnSi_Sr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование значений в дату
123ййNorman94он снова пишет invalid number
я так понял, теперь он уже пишет "invalid identifier"
...
Рейтинг: 0 / 0
20.03.2017, 13:52
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Преобразование значений в дату / 25 сообщений из 65, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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