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;
---------
3
- select REALISASI('1-JAN-2010','10-JAN-2010') as SELISIH from dual;
---------
7
- select REALISASI('1-JAN-2010','15-JAN-2010') as SELISIH from dual;
---------
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,
Mohon dibantu ya...
BalasHapuskoyk tau ngerti plsql ki... sak ketipan tok....wakkakakka
BalasHapus@vanfier:
BalasHapusWooo... Mayak !!!
Gak gelem ngewangi, malah di "ketipi" tokkk
Kenapa ketika saya mengolah :
BalasHapusselect 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 ....
Salam,
BalasHapusMas 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
@Andry_lie :
BalasHapusOke 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
Ada Eror lagi, ketika saya menambahkan filter untuk libur nasional, sebagai berikut :
BalasHapusselect 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 ??
Wah sudah ketemu ternyata,
BalasHapusSolusinya, 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... ^_^
Apakah anda masih menyimpan script function lengkapnya untuk menghitung jumlah hari tanpa menyertakan hari libur ini?
Hapusnice info....
BalasHapuskeep posting bro...
thanks for the info :)
BalasHapus