sql >> Database >  >> RDS >> Oracle

Geen geldige maand in oracle wanneer add_months wordt gebruikt

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.



  1. PostgreSQL - Referenties voor externe sleutels wederzijds exclusieve tabellen

  2. Deze tabel maken in orakel 10g

  3. Streaming MySql ResultSet met een vast aantal resultaten tegelijk

  4. Dynamische SQL versus opgeslagen procedure