Я получил ORA-00904 при попытке получить список рабочих дней с ORACLE - PullRequest
1 голос
/ 24 апреля 2020

В моем проекте мне нужно использовать функцию с именем 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": неверный идентификатор

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

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Ваша функция, 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().

0 голосов
/ 24 апреля 2020

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

...