Tanggal tidak memiliki format - tanggal disimpan secara internal ke database sebagai 7-byte (mewakili tahun, bulan, hari, jam, menit dan detik) dan tidak sampai antarmuka pengguna apa pun yang Anda gunakan (yaitu SQL/Plus, Pengembang SQL, Java, dll) mencoba menampilkannya kepada Anda, pengguna, dan mengonversi menjadi sesuatu yang menurut Anda bermakna (biasanya berupa string) yang memiliki format tanggal.
Jika Anda memberikan tanggal yang diformat ke suatu prosedur maka itu akan menjadi string dan Oracle akan mencoba untuk secara implisit melemparkannya ke tanggal menggunakan NLS_DATE_FORMAT
parameter sesi:
UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter
Secara implisit dikonversi ke
UPDATE your_table
SET your_date_column = TO_DATE(
'18-06-14',
( SELECT value
FROM NLS_SESSION_PARAMETERS
WHERE parameter = 'NLS_DATE_FORMAT' )
);
Jika NLS_DATE_FORMAT
tidak cocok maka Oracle akan memunculkan pengecualian (dan parameter dapat diatur oleh setiap pengguna sehingga Anda tidak harus mengandalkannya untuk konsisten - terutama di organisasi internasional ketika format tanggal default bergantung pada wilayah dan bahasa Anda).
Jika Anda memperbarui nilainya, gunakan DATE
literal dan bukan string:
UPDATE your_table
SET your_date_column = DATE '2014-06-18';
Atau konversi string secara eksplisit dan berikan model format:
UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );
Hal yang sama berlaku untuk meneruskan parameter ke fungsi Anda. Gunakan DATE
harfiah:
BEGIN
your_procedure(
p_launch_date => DATE '2014-06-18'
);
END;
/
atau secara eksplisit mengonversi string menjadi tanggal (dan tidak bergantung pada konversi implisit):
BEGIN
your_procedure(
p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
);
END;
/