Nigdy, przenigdy nie używaj TO_DATE()
na czymś, co jest już DATE
. Powodem tego jest to, że Oracle będzie musiał wykonać kilka niejawnych konwersji, aby spełnić Twoje życzenia:
TO_DATE(sysdate, 'mm-yyyy')
jest naprawdę prowadzony jako
TO_DATE(TO_CHAR(sysdate, '<default nls_date_format parameter>'), 'mm-yyyy')
więc jeśli twój nls_date_format jest ustawiony na coś innego niż „mm-rrrr”, będziesz mieć problemy. Domyślnym parametrem nls_date_format jest „DD-MON-RR”, co jest bardziej niż prawdopodobną wartością ustawioną przez Ciebie.
Jeśli wszystko, co chciałeś zrobić, to dodać_miesięcy do 1. dnia bieżącego miesiąca, powinieneś użyć TRUNC()
, np.:
add_months(trunc(sysdate, 'MM'),-12)
Oto dowód na niejawne to_char, jeśli do_datujesz coś, co jest już datą, zgodnie z żądaniem Lalita - plan wykonania podstawowego zapytania obejmującego 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]!)
Możesz wyraźnie zobaczyć TO_CHAR()
w stanie filtra.