У меня есть функция с именем WORKING_DAY
, которая принимает одну дату в качестве параметра и возвращает логическое значение как TRUE
или FALSE
после проверки календаря праздников и выходных.
Как использовать эта функция в приведенном выше фрагменте кода эффективно для получения требуемой даты?
Вы не можете использовать ее в выражении SQL, поскольку BOOLEAN
является типом данных PL / SQL и не существует в SQL.
Если вы хотите вернуть истинное значение в SQL, верните литерал (т. е. 0
/ 1
или 'Y'
/ 'N'
et c.) И сравните, если нужно.
Таким образом, ваша функция должна быть изменена с возврата типа данных BOOLEAN
(только PL / SQL) на:
CREATE FUNCTION is_working_day(
dt IN DATE
) RETURN NUMBER
IS
is_working_day BOOLEAN;
BEGIN
-- do stuff.
IF is_working_day THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
/
Обновление
после изменения функции, как я могу использовать эту функцию в этом фрагменте кода для получения требуемой даты вступления в силу?
Вы не можете использовать эту функцию, чтобы определить, сколько дней вам нужно добавить. Функция возвращает истинное значение, поэтому, если вы не собираетесь повторять каждый последующий день и проверять, является ли это рабочим днем (что трудно сделать в SQL), то ваш текущий метод возврата истинного значения не будет работать.
Вместо этого переместите логи c в функцию, которая сообщает, сколько дней нужно добавить:
CREATE FUNCTION days_until_next_working_day(
dt IN DATE
) RETURN INTEGER
IS
current_day DATE := dt;
BEGIN
WHILE NOT is_working_day( current_day ) LOOP
current_day := current_day + INTERVAL '1' DAY;
END LOOP;
RETURN current_day - dt;
END;
/
(Вероятно, есть более эффективный способ написать это вычислять следующий рабочий день, а не повторять каждый последующий день, но мы не знаем, как вы определяете выходные, и т. д. c., поэтому мы не можем его оптимизировать.)
Тогда просто добавьте возвращаемое значение в ваш запрос SQL, чтобы пропустить это количество дней.