Tanggal tidak memiliki format - tanggal diwakili secara internal oleh 7- atau 8- byte . Hanya ketika program klien melewati tanggal yang program klien (berpotensi) memberikannya format.
Format string default untuk tanggal di SQL/Plus atau SQL Developer disetel oleh NLS_DATE_FORMAT
parameter sesi. Klien lain biasanya memiliki parameter yang dapat Anda atur untuk format tanggal default (jika mereka juga tidak menggunakan NLS
pengaturan). Namun, berhati-hatilah bahwa NLS_DATE_FORMAT
adalah parameter sesi sehingga menjadi milik sesi pengguna dan beberapa pengguna masing-masing dapat memiliki nilai yang berbeda untuk parameter yang sesuai dengan cara mereka menyetelnya.
Jika Anda ingin memberikan tanggal dengan format tertentu, Anda harus mengubahnya menjadi string:
SELECT TO_CHAR( DATE '2016-05-01', 'MM/DD/YYYY HH24:MI:SS' )
FROM DUAL;
Mengapa kueri Anda tidak berfungsi :
TO_DATE( value, frmt )
mengharapkan nilai string dan topeng format. TO_DATE('2016-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
bagian dalam benar-benar valid dan akan mengembalikan DATE '2016-05-01'
.
Namun, bagian luar TO_DATE()
kemudian diteruskan DATE
ketik yang baru saja Anda buat dan format string (bukan dua string yang diharapkan). Oracle secara implisit akan memanggil TO_CHAR()
pada tanggal dan gunakan NLS_DATE_FORMAT
parameter sesi sebagai topeng format. Ini menghasilkan string dari tanggal dan, dengan kesalahan, nilai NLS_DATE_FORMAT
bukan MM/DD/YYYY HH24:MI:SS
jadi ketika bagian luar TO_DATE()
mencoba mengurai string yang dibuat secara implisit itu gagal karena angka pertama yang dibacanya tidak valid selama sebulan.