Brug aldrig, aldrig TO_DATE()
på noget, der allerede er en DATE
. Grunden til dette er, fordi Oracle bliver nødt til at foretage nogle implicitte konverteringer for at følge dine ønsker:
TO_DATE(sysdate, 'mm-yyyy')
køres virkelig som
TO_DATE(TO_CHAR(sysdate, '<default nls_date_format parameter>'), 'mm-yyyy')
så hvis dit nls_date_format er sat til noget andet end 'mm-yyyy', vil du få problemer. Standardparameteren nls_date_format er 'DD-MON-YY', hvilket er mere end sandsynligt, at værdien din er indstillet til.
Hvis alt hvad du ville gøre var at tilføje_måneder til den 1. i den aktuelle måned, så skal du bruge TRUNC()
, f.eks.:
add_months(trunc(sysdate, 'MM'),-12)
Her er et bevis på det implicitte to_char, hvis du to_date noget, der allerede er en dato, som anmodet af Lalit - en eksekveringsplan for en grundlæggende forespørgsel, der involverer 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]!)
Du kan tydeligt se TO_CHAR()
i filtertilstand.