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.