Jangan pernah gunakan TO_DATE()
pada sesuatu yang sudah menjadi DATE
. Alasannya adalah karena Oracle harus melakukan beberapa konversi implisit untuk mengikuti keinginan Anda:
TO_DATE(sysdate, 'mm-yyyy')
benar-benar dijalankan sebagai
TO_DATE(TO_CHAR(sysdate, '<default nls_date_format parameter>'), 'mm-yyyy')
jadi jika nls_date_format Anda disetel ke sesuatu selain 'mm-yyyy', Anda akan mengalami masalah. Parameter nls_date_format default adalah 'DD-MON-YY', yang kemungkinan besar adalah nilai yang Anda atur.
Jika semua yang ingin Anda lakukan adalah menambahkan_bulan ke tanggal 1 bulan ini, maka Anda harus menggunakan TRUNC()
, misalnya:
add_months(trunc(sysdate, 'MM'),-12)
Berikut bukti dari to_char implisit jika Anda memberi tanggal pada sesuatu yang sudah menjadi tanggal, seperti yang diminta oleh Lalit - rencana eksekusi kueri dasar yang melibatkan to_date(sysdate):
SQL_ID 3vs3gzyx2gtcn, child number 0
-------------------------------------
select * from dual where to_date(sysdate) < sysdate
Plan hash value: 3752461848
----------------------------------------------------------------------------
| Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TO_DATE(TO_CHAR([email protected]!))<[email protected]!)
Anda dapat dengan jelas melihat TO_CHAR()
dalam kondisi filter.