Fungsi Oracle Rentang Tanggal
Masalah
Saya ingin membuat procedure didalam Oracle dengan input parameter startdate dan enddate untuk keperluan billing period. Namun user ingin cara praktis, sehingga untuk memasukkan 3 bulan periode berturut-turut cukup dengan 2 parameter saja.
Contoh :
Input Parameter :
startdate : 5 Januari 2023
enddate : 15 Maret 2023
Output :
5 Januari 2023 - 31 Januari 2023
1 Februari 2023 - 28 Februari 2023
1 Maret 2023 - 15 Maret 2023
Jawaban
Berikut adalah contoh fungsi Oracle untuk menampilkan rentang tanggal sesuai dengan jumlah bulan yang diinputkan pada parameter.
CREATE OR REPLACE FUNCTION get_date_range(
p_startdate IN DATE,
p_enddate IN DATE
) RETURN SYS_REFCURSOR AS
v_cursor SYS_REFCURSOR;
v_current_month_start DATE;
v_current_month_end DATE;
v_month_count NUMBER;
BEGIN
-- Hitung jumlah bulan antara tanggal awal dan akhir
v_month_count := MONTHS_BETWEEN(TRUNC(p_enddate, 'MM'), TRUNC(p_startdate, 'MM'));
-- buat cursor untuk menampung hasil query
OPEN v_cursor FOR
SELECT TRUNC(ADD_MONTHS(p_startdate, LEVEL - 1), 'MM') AS start_date,
LAST_DAY(ADD_MONTHS(p_startdate, LEVEL - 1)) AS end_date
FROM DUAL
CONNECT BY LEVEL <= v_month_count + 1;
RETURN v_cursor;
END;
/
Fungsi diatas mengembalikan nilai SYS_REFCURSOR sehingga untuk memanggil nya dapat kita lakukan dengan cara berikut
DECLARE
v_cursor SYS_REFCURSOR;
v_start_date DATE;
v_end_date DATE;
BEGIN
v_start_date := TO_DATE('2023-03-15', 'YYYY-MM-DD');
v_end_date := TO_DATE('2023-05-18', 'YYYY-MM-DD');
v_cursor := get_date_range(v_start_date, v_end_date);
LOOP
FETCH v_cursor INTO v_start_date, v_end_date;
EXIT WHEN v_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Start date: ' || TO_CHAR(v_start_date, 'DD-MON-YYYY'));
DBMS_OUTPUT.PUT_LINE('End date: ' || TO_CHAR(v_end_date, 'DD-MON-YYYY'));
END LOOP;
CLOSE v_cursor;
END;
/
Dalam contoh di atas, kita mendefinisikan dua variabel v_start_date dan v_end_date sebagai input untuk fungsi get_date_range. Kemudian kita memanggil fungsi tersebut dan menampung hasilnya dalam variabel v_cursor.
Selanjutnya, kita membaca nilai dari kursor dengan melakukan looping menggunakan perintah FETCH. Perintah EXIT WHEN v_cursor%NOTFOUND akan menghentikan looping ketika tidak ada baris lagi yang bisa diambil dari kursor.
Setiap kali kita mengambil baris dari kursor, kita menampilkan nilai dari v_start_date dan v_end_date menggunakan DBMS_OUTPUT.PUT_LINE.
Terakhir, kita menutup kursor menggunakan perintah CLOSE.
Sekarang Anda dapat menjalankan contoh PL/SQL di atas untuk menampilkan nilai dari fungsi get_date_range dengan cara yang benar.