2014-09-18 4 views
1

Мне нужно написать функцию, которая даст мне новую дату оплаты для счета-фактуры. Это должно быть 12 рабочих дней после текущей даты. Сказать, что текущая дата оплаты - 01.Oct.2014. Если я посмотрю на свой календарь вручную, я вижу, что новая дата будет равна 17.Oct.2014 (необходимо исключить выходные дни).date + 7 рабочих дней

Однако у меня также есть стол с праздничными днями. Это нужно было бы принять во внимание. Поэтому, если у меня будет праздничный день в 04.Oct.2014, новая дата должна быть 18.Oct.2014.

EDIT: Моя таблица в праздничные дни будет выглядеть примерно так:

Год: Дата: Описание

2014 04.Oct.2014 раздничный 1

Любая помощь с этим было бы глубоко оценил, я застрял на этом уже почти целый день.

Большое спасибо.

Сердечные приветы

Gerben

+0

Вы сохраняете даты отпуска в таблице? Отправьте тестовый пример того, что вы пытаетесь сделать. Каковы таблицы? –

+0

Привет Лалит, вопрос имеет пример. Моя функция имела параметр IN с текущей датой. Мне нужно добавить 12 рабочих дней, за исключением праздничных дней в банке. Таблица с Банковскими каникулами называется bank_holidays – Gerben

+0

Итак, добавьте конструкцию 'CASE', так что если какая-либо из дат в таблице bank_holidays составляет BETWEEN your current_due_date и current_due_date + 12, добавьте равное количество дней для этих праздничных дней. –

ответ

0

я в конечном итоге делает вещи немного по-другому. У меня есть стол со всем моим банковским праздником. Я создал вторую таблицу как своего рода календарь. Здесь я загрузил все даты в год. Затем я отмечаю это как выходные или праздничные дни (две отдельные колонки).

Я принимаю свой первоначальный срок, и добавьте 12 дней. Затем у меня есть дата начала и окончания (v_due_date_old и v_due_date_new)

После этого я подсчитываю, сколько дней в моей таблице «Календарь», где для моего флага на выходные или праздничные дни установлен «Да». Если v_due_date_new находится в субботу, я добавлю еще один день на мой счет.

Затем я добавляю новый счет в v_due_date_new.

Как последний шаг, я проверяю, в какой день v_due_date_new. Если это суббота или воскресенье, я добавляю еще 2 дня

1

Что-то, как это должно работать:

DECLARE 
    l_date DATE := SYSDATE; 

    FUNCTION IS_WEEKEND(P_DATE IN DATE) 
    RETURN BOOLEAN 
    IS 
    l_daynum VARCHAR2(1) := to_char (P_DATE, 'D'); 
    BEGIN 
    RETURN l_daynum = '6' OR l_daynum = '7'; 
    END; 

    FUNCTION IS_HOLIDAY(P_DATE IN DATE) 
    RETURN BOOLEAN 
    IS 
    CURSOR c_exists IS 
     SELECT 1 FROM bank_holidays WHERE date = TRUNC(P_DATE) 
    ; 
    l_count NUMBER; 
    BEGIN 
    OPEN c_exists; 
    l_count := c_exists%ROWCOUNT; 
    CLOSE c_exists; 
    RETURN l_count > 0; 
    END; 

    PROCEDURE ADD_WORKING_DAYS(P_DATE IN OUT DATE, P_DAYS IN NUMBER) 
    IS 
    l_workdays_added NUMBER := 0; 
    BEGIN 
    WHILE TRUE 
    LOOP 
     P_DATE := P_DATE + 1; 
     IF NOT IS_WEEKEND(P_DATE) AND NOT IS_HOLIDAY(P_DATE) THEN 
     l_workdays_added := l_workdays_added + 1; 
     END IF; 
     IF l_workdays_added = P_DAYS THEN 
     RETURN; 
     END IF; 
    END LOOP; 
    END; 

BEGIN 
    ADD_WORKING_DAYS(l_date, 12); 
END; 
Смежные вопросы