Я получил ORA-00904 при попытке получить список рабочих дней с помощью ORACLE.

В моем проекте мне нужно использовать функцию с именем getWorkingDay(beg_date Date,slider Integer). Эта функция используется для нахождения n-го последнего рабочего дня с даты beg_date (где «n» — это значение из slider). Что я хотел бы сделать, так это получить все рабочие дни в диапазоне дат, определенном beg_date и end_date. Я хотел бы использовать оператор SELECT и функцию выше, чтобы получить список рабочих дней. Я попробовал этот оператор с beg_date=sysdate-45 и end_date=sysdate :

SELECT * FROM(
SELECT getworkingDay(sysdate,slide) dt FROM DUAL
WHERE slide>0 and slide<=sysdate-(sysdate-45))
WHERE dt >=sysdate-45

Я получил следующую ошибку:

ORA-00904 : "SLIDE": неверный идентификатор

Не могли бы вы помочь мне найти способ решить эту проблему?


person Labedos    schedule 24.04.2020    source источник
comment
Отредактируйте свой вопрос и опубликуйте функцию getworkingDay.   -  person Ergi Nushi    schedule 24.04.2020


Ответы (2)


Ваша функция getWorkingDays работает только для одной даты.
Если вы хотите, чтобы она работала для диапазона дат, вам нужно вызывать ее один раз для каждого дня в диапазоне дат.
Используя пример из ваш вопрос, sysdate - 45, означает, что вам нужно назвать его 45 раз, как в

select getWorkingDays(sysdate - 45, 1) from dual
union
select getWorkingDays(sysdate - 44, 1) from dual
union
select getWorkingDays(sysdate - 43, 1) from dual

Надеюсь, вы уловили идею. Я подставил значение 1 (один) для вашей переменной slider. Вам нужно определить его как переменную. Вы утверждаете, что используете SQL Developer, поэтому я предлагаю вам обратиться к документации по этому продукту, чтобы узнать, как определять переменные.

В качестве альтернативы вы можете написать SQL-запрос, который возвращает ровно 45 строк (опять же, 45, потому что это пример, который вы использовали в своем вопросе). Я считаю, что следующий вопрос SO показывает, как этого добиться:

Запрос SQL для возврата N строк из двойного

Адаптируя ответ на этот вопрос SO, а также пример из вашего вопроса, я считаю, что должно работать что-то вроде следующего.

SELECT getWorkingDays(sysdate - (45 - LEVEL), 1)
  FROM DUAL
CONNECT BY LEVEL <= 45

Конечно, я не могу это проверить, так как у меня нет кода для функции getWorkingdays().

person Abra    schedule 24.04.2020

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

person bsk    schedule 24.04.2020
comment
Что мне нужно сделать, так это использовать функцию getWorkingDays с аргументом slide между 0 и sysdate-(sysdate-45). - person Labedos; 24.04.2020
comment
Мне нужно увидеть вашу функцию, но в какой таблице есть столбцы слайдов и dt? вы можете изменить двойную таблицу на эту и попробовать - person bsk; 24.04.2020