Mai, mai usare TO_DATE()
su qualcosa che è già un DATE
. Il motivo è perché Oracle dovrà eseguire alcune conversioni implicite per seguire i tuoi desideri:
TO_DATE(sysdate, 'mm-yyyy')
è realmente eseguito come
TO_DATE(TO_CHAR(sysdate, '<default nls_date_format parameter>'), 'mm-yyyy')
quindi se il tuo nls_date_format è impostato su qualcosa che è diverso da "mm-aaaa", avrai problemi. Il parametro nls_date_format predefinito è 'DD-MON-YY', che è molto probabilmente il valore su cui è impostato il tuo.
Se tutto ciò che volevi fare era aggiungere_mesi al 1° del mese corrente, allora dovresti usare TRUNC()
, ad esempio:
add_months(trunc(sysdate, 'MM'),-12)
Ecco la prova dell'implicito to_char se to_date qualcosa che è già una data, come richiesto da Lalit - un piano di esecuzione di una query di base che coinvolge 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]!)
Puoi vedere chiaramente il TO_CHAR()
in condizione di filtro.