10 Februari 2010

Belajar Function di PLSQL ( Studi Kasus )

Berikut ini , saya ingin menghitung selisih tanggal, antara tanggal awal dan tanggal akhir, dimana dalam studi kasus ini, jika hari=sabtu atau hari=minggu, maka tidak terhitung. Untuk itu saya membuat sebuah function dalam PLSQL berikut ini :

create or replace
function Realisasi(awal DATE,akhir DATE)
return NUMBER
is
nilai NUMBER;
awal2 DATE;
i NUMBER(5);
hasil NUMBER (5);
hari VARCHAR2(20);

begin
nilai := round(akhir-awal,0);
hasil := 0;
awal2 :=awal;

for i in 1 .. nilai
loop
hari := trim(to_char(awal2,'day'));
if hari = 'saturday' or hari = 'sunday'
then
hasil := hasil;
else
hasil := hasil+1;
end if;
awal2 := to_date(awal2,'dd-mm-yyyy')+1;
end loop;
return (hasil);
end;

Ketika saya menguji program tersebut dengan beberapa percobaan, hasilnya adalah sebagai berikut
  • select REALISASI('1-JAN-2010','5-JAN-2010') as SELISIH from dual;
SELISIH
---------
3
  • select REALISASI('1-JAN-2010','10-JAN-2010') as SELISIH from dual;
SELISIH
---------
7
  • select REALISASI('1-JAN-2010','15-JAN-2010') as SELISIH from dual;
SELISIH
---------
10

Nah, ketika saya hitung manual, dimana hari sabtu dan minggu tidak ikut di hitung hasilnya kok tidak sesui dengan program di atas. Mohon bantuanya dari pembaca sekalian...
Gimana seharusnya ??
Padahal itu masih sabtu, minggu. Belum yang Hari Libur (dimana hari libur saya membuat sebuah tabel lagi, isinya tanggal berapa saja dalam satu tahun yang libur).
Tulung di bantu ya...
Jazakumullah khoiron katsiro,

10 komentar:

  1. koyk tau ngerti plsql ki... sak ketipan tok....wakkakakka

    BalasHapus
  2. @vanfier:
    Wooo... Mayak !!!
    Gak gelem ngewangi, malah di "ketipi" tokkk

    BalasHapus
  3. Kenapa ketika saya mengolah :
    select realisasi('01-JAN-2010','6-JAN-2010') as hari from dual;
    Tapi yang di proses adalah
    '01-JAN-0010','06-JAN-0010' ??

    What Happen,,, I cannot find solution for this problem...
    Help Help Help ....

    BalasHapus
  4. Salam,

    Mas di coba jalankan function ini..

    create or replace function date_diff(chardate1 varchar2, chardate2 varchar2) return number is
    diff number;
    date1 date;
    date2 date;
    total number:=0;
    begin
    date1 := to_date(chardate1,'dd/mm/yyyy');
    date2 := to_date(chardate2,'dd/mm/yyyy');
    diff := date2-date1;
    for i in 0..diff-1 loop
    if(to_char(date1+i,'d') <> '1' and to_char(date1+i,'d') <> '7') then
    total := total+1;
    end if;
    end loop;
    return total;
    end;


    code di atas untuk melalukan perhitungan tanpa melibatkan hari sabtu dan minggu.
    untuk melibatkan hari libur nasional... tinggal menggunakan 1 table yang melakan pengisian tangallnya .... dan tinggal di tambahkan validasi tambahan

    BalasHapus
  5. @Andry_lie :
    Oke makasih mas, dah saya compile dan hasilnya perfect. Saya tambahkan sedikit program, dibawah ini :
    diff := date2-date1;
    dengan paramter berikut ini :
    date1 := to_date (chardate1,'dd/mm/yyyy'+1);
    Karena, Hari Pertama tidak di hitung, Tetapi mulai di hitung adalah hari berikutnya, makanya harus ditambahkan 1.

    Thanks banget buat mas Andry

    BalasHapus
  6. Ada Eror lagi, ketika saya menambahkan filter untuk libur nasional, sebagai berikut :

    select count(tanggal_libur) into jumlibur from M_TAHUN;
    for i in 0..diff-1 loop
    if(to_char(date1+i,'d') <> '1' and to_char(date1+i,'d') <> '7') then
    for j in 1..jumlibur loop
    select tanggal_libur into tanggallibur from M_TAHUN where id_libur=j;
    if(to_char(date1+i,'dd-mm-yyyy') <> to_char(tanggallibur,'dd-mm-yyyy')) then
    total := total+1;
    end if;
    end loop;
    end if;
    end loop;
    return total;

    Muncul Pesan Eror :
    Error(20,43): PLS-00307: too many declarations of 'TO_CHAR' match this call

    Kalau pakai tipe data date, tidak ada eror...
    hanya saja sama seperti kasus sebelumnya, hasilnya tidak sesuai,,,,
    What Happen ??

    BalasHapus
  7. Wah sudah ketemu ternyata,
    Solusinya, datanya tidak perlu dirubah jadi char ataupun date, langsung di cek manual aja...
    for j in 1..jumlibur loop
    select tanggal_libur into tanggallibur from M_TAHUN where id_libur=j;
    if(date1+i = tanggallibur) then
    total := total-1;
    end if;
    end loop;

    Dah berhasil.....
    Ehmmm
    Thanks banget buat mas Andry,,, dah banyak bantu... ^_^

    BalasHapus
  8. nice info....
    keep posting bro...

    BalasHapus

^_^