W jaki sposób obliczyć dni robocze uwzględniając godz. pracy, np. pn-pt 8-22, sb-nd 8-17, święta.
Jak powinna wyglądać składnia takiej procedury?
W jaki sposób obliczyć dni robocze uwzględniając godz. pracy, np. pn-pt 8-22, sb-nd 8-17, święta.
Jak powinna wyglądać składnia takiej procedury?
Napisałem niegdyś funkcję do obliczania dni roboczych pomiędzy dwoma datami dla SQL Server https://quorum.akademiq.pl/discussion/591. Po niewielkiej przeróbce powinna również działać na Oracle'u.
Bazując na idei mojej funkcji można ją rozbudować, aby uwzględniała godziny.
Za pomocą funkcji konwertującej można uzyskać nazwę dnia tygodnia:
SELECT to_char(sysdate, 'DAY') from dual;
Dla zmiennej środowiskowej NLS_LANG ustawionej dla Ameryki (Anglii) dzień wolny zaczyna się na literę 'S'.
Niestety święta należy obsłużyć oddzielnie.
Przykład:
CREATE OR REPLACE FUNCTION Dni_robocze (
Date1 Date default to_Date('2015-01-10', 'YYYY-MM-DD'),
Date2 Date := to_Date('2015-03-15', 'YYYY-MM-DD')
)
RETURN
number
IS
result number;
BEGIN
SELECT Date2-Date1
INTO result
FROM dual;
WITH tab(Liczba) as (
SELECT 0 as Liczba from dual
UNION ALL
SELECT Liczba + 1 as Liczba FROM tab WHERE Liczba < 1000
)
SELECT SUM (IS_BUSINESS_DAY)
INTO result
FROM
(SELECT
CASE
WHEN SUBSTR(to_char(Date1 + tab.Liczba, 'DAY'),1,1) = 'S'
THEN 0
ELSE 1
END as IS_BUSINESS_DAY
FROM tab
WHERE tab.Liczba <= result
);
return result;
END;
/
Powyższa funkcja zwróci liczbę dni nie będących sobotą i niedzielą w zakresie dat podanych jako parametr (wliczając te daty). Zadziała prawidłowo, jeżeli odległość dat będzie mniejsza niż 1000 dni, a pierwsza data będzie wcześniejsza.