Gebruik nooit, maar dan ook nooit TO_DATE()
op iets dat al een DATE
. is . De reden hiervoor is dat Oracle enkele impliciete conversies zal moeten doen om aan uw wensen te voldoen:
TO_DATE(sysdate, 'mm-yyyy')
wordt echt uitgevoerd als
TO_DATE(TO_CHAR(sysdate, '<default nls_date_format parameter>'), 'mm-yyyy')
dus als je nls_date_format is ingesteld op iets anders dan 'mm-jjjj', zul je problemen krijgen. De standaard nls_date_format parameter is 'DD-MON-YY', wat meer dan waarschijnlijk de waarde is waarop de jouwe is ingesteld.
Als u alleen maar_maanden wilt toevoegen aan de 1e van de huidige maand, moet u TRUNC()
gebruiken , bijvoorbeeld:
add_months(trunc(sysdate, 'MM'),-12)
Hier is het bewijs van de impliciete to_char als je iets to_date dat al een datum is, zoals gevraagd door Lalit - een uitvoeringsplan van een basisquery met 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]!)
Je kunt de TO_CHAR()
. duidelijk zien in de filterconditie.