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.