Kategorie szkoleń | Egzaminy | Kontakt
  • 2
  • 1
  • 717

Odpowiedzi (2)

  • 1

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. 

  • Odpowiedział
  • @ | 31.03.2014
  • TRENER ALTKOM AKADEMII
  • 0

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.

 

  • Odpowiedział
  • @ | 09.03.2015
  • TRENER ALTKOM AKADEMII