16 Şubat 2009 Pazartesi

Verilen iki tarih grubunun kesişimi kaç gün ?

Bu fonsiyon başlangıç ve bitiş tarihi verilen iki
zaman aralığının kesişiminin kaç gün olduğunu döndürür.
Fonksiyonun düzgün çalışabilmesi için
başlama tarihleri, bitiş tarihlerinden küçük olmalıdır.

FUNCTION kesisen_kac_gun_var (
tarih1_bas_ DATE,
tarih1_bit_ DATE,
tarih2_bas_ DATE,
tarih2_bit_ DATE
)
RETURN NUMBER
IS
TYPE sayiarray IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;

gecici sayiarray;
top_gun NUMBER := 0;
min_ NUMBER;
max_ NUMBER;
BEGIN
IF (tarih1_bas_ IS NULL)
OR (tarih1_bit_ IS NULL)
OR (tarih2_bas_ IS NULL)
OR (tarih2_bit_ IS NULL)
THEN
RETURN 0;
END IF;

min_ :=
LEAST (tarih1_bas_, tarih2_bas_)
- TO_DATE ('01.01.2000', 'dd.mm.yyyy')
- 10; -- +-10 araligi tedbir icic genis tuttum
max_ :=
GREATEST (tarih1_bit_, tarih2_bit_)
- TO_DATE ('01.01.2000', 'dd.mm.yyyy')
+ 10;

--array ın kullanilacak kismi 0 ile set ediliyor
--dbms_output.put_line('min_: ' || min_ || ' max_ : '||max_ );
FOR i IN min_ .. max_
LOOP
gecici (i) := 0; --deger null olursa hata oluşuyor
END LOOP;

--ilk tarih araligi her gun icin -1 ile set ediliyor
FOR i IN 1 .. (tarih1_bit_ - tarih1_bas_)
LOOP
gecici ( TO_DATE (tarih1_bas_, 'dd.mm.yyyy')
- TO_DATE ('01.01.2000', 'dd.mm.yyyy')
+ i
) := -1;
END LOOP;

--bazi -1 ler 1 olarak set ediliyor
FOR i IN 1 .. (tarih2_bit_ - tarih2_bas_)
LOOP
IF gecici ( TO_DATE (tarih2_bas_, 'dd.mm.yyyy')
- TO_DATE ('01.01.2000', 'dd.mm.yyyy')
+ i
) = -1
THEN
gecici ( TO_DATE (tarih2_bas_, 'dd.mm.yyyy')
- TO_DATE ('01.01.2000', 'dd.mm.yyyy')
+ i
) := 1;
END IF;
END LOOP;

--sonuc 1 lerin toplami
FOR i IN LEAST (tarih1_bas_, tarih2_bas_)
- TO_DATE ('01.01.2000', 'dd.mm.yyyy')
- 10 .. GREATEST (tarih1_bit_, tarih2_bit_)
- TO_DATE ('01.01.2000', 'dd.mm.yyyy')
+ 10
LOOP
IF gecici (i) = 1
THEN
top_gun := top_gun + gecici (i);
END IF;
END LOOP;

RETURN top_gun;
END;

Hiç yorum yok:

Yorum Gönder