Никога, ама никога не използвайте TO_DATE()
на нещо, което вече е DATE
. Причината за това е, че Oracle ще трябва да направи някои неявни преобразувания, за да следва вашите желания:
TO_DATE(sysdate, 'mm-yyyy')
наистина се изпълнява като
TO_DATE(TO_CHAR(sysdate, '<default nls_date_format parameter>'), 'mm-yyyy')
така че ако вашият nls_date_format е зададен на нещо, което е различно от 'mm-yyyy', ще имате проблеми. Параметърът nls_date_format по подразбиране е „DD-MON-YY“, което е повече от вероятно стойността, на която е зададена вашата.
Ако всичко, което искате да направите, е да добавите_месеци към 1-во число на текущия месец, тогава трябва да използвате TRUNC()
, напр.:
add_months(trunc(sysdate, 'MM'),-12)
Ето доказателство за имплицитния to_char, ако to_date нещо, което вече е дата, както е поискано от Lalit - план за изпълнение на основна заявка, включваща 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]!)
Можете ясно да видите TO_CHAR()
в състояние на филтър.