Никогда, никогда не используйте TO_DATE()
на чем-то, что уже является DATE
. Причина этого в том, что Oracle придется выполнять некоторые неявные преобразования, чтобы следовать вашим пожеланиям:
TO_DATE(sysdate, 'mm-yyyy')
действительно работает как
TO_DATE(TO_CHAR(sysdate, '<default nls_date_format parameter>'), 'mm-yyyy')
поэтому, если для вашего nls_date_format установлено значение, отличное от «мм-гггг», у вас возникнут проблемы. Параметр nls_date_format по умолчанию — «DD-MON-YY», что, скорее всего, соответствует вашему значению.
Если все, что вы хотели сделать, это добавить_months к 1-му числу текущего месяца, тогда вам следует использовать TRUNC()
, например:
add_months(trunc(sysdate, 'MM'),-12)
Вот доказательство неявного to_char, если вы to_date что-то, что уже является датой, по запросу Лалита - план выполнения базового запроса, включающего 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(SYSDATE@!))<SYSDATE@!)
Вы можете ясно видеть TO_CHAR()
в условии фильтра.
person
Boneist
schedule
19.03.2015