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.