Oracle
 sql >> Database >  >> RDS >> Oracle

Non è un mese valido in Oracle quando viene utilizzato add_months

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.