sql >> データベース >  >> RDS >> Oracle

add_monthsが使用されている場合、Oracleでは有効な月ではありません

    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()がはっきりとわかります フィルター状態で。



    1. SQLクエリで特定のデータベースのすべてのテーブル名を取得しますか?

    2. 構文をトリガーし、IF ELSETHEN

    3. 時間部分を無視してDATETIMEとDATEを比較します

    4. .csvファイルをOracleFormsアプリケーションにインポートする