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日にadd_monthsを追加するだけの場合は、TRUNC()
を使用する必要があります。 例:
add_months(trunc(sysdate, 'MM'),-12)
Lalitの要求に応じて、すでに日付になっているものをto_dateする場合の暗黙的なto_charの証明は次のとおりです-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()
がはっきりとわかります フィルター状態で。