Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Kein gültiger Monat in Oracle, wenn add_months verwendet wird

Verwenden Sie niemals TO_DATE() auf etwas, das bereits ein DATE ist . Der Grund dafür ist, dass Oracle einige implizite Konvertierungen durchführen muss, um Ihren Wünschen zu folgen:

TO_DATE(sysdate, 'mm-yyyy')

wird wirklich als

ausgeführt

TO_DATE(TO_CHAR(sysdate, '<default nls_date_format parameter>'), 'mm-yyyy')

Wenn also Ihr nls_date_format auf etwas anderes als „mm-yyyy“ eingestellt ist, werden Sie Probleme bekommen. Der standardmäßige nls_date_format-Parameter ist 'DD-MON-YY', was höchstwahrscheinlich der Wert ist, auf den Sie eingestellt sind.

Wenn Sie lediglich_months zum 1. des aktuellen Monats hinzufügen wollten, sollten Sie TRUNC() verwenden , zB:

add_months(trunc(sysdate, 'MM'),-12)

Hier ist der Beweis für das implizite to_char, wenn Sie etwas to_date haben, das bereits ein Datum ist, wie von Lalit gefordert - ein Ausführungsplan einer einfachen Abfrage mit 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]!)

Sie können deutlich das TO_CHAR() sehen im Filterzustand.