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

ORA-1843:レコードの更新中に有効な月ではありません

    日付には形式がありません。データベースの内部に7バイト として保存されます。 (年、月、日、時、分、秒を表します)使用しているユーザーインターフェイス(SQL / Plus、SQL Developer、Javaなど)がユーザーに表示を試み、変換するまではありません日付に形式があることを意味のあるもの(通常は文字列)に変換します。

    フォーマットされた日付をプロシージャに提供する場合、それは文字列になり、OracleはNLS_DATE_FORMATを使用して暗黙的に日付にキャストしようとします。 セッションパラメータ:

    UPDATE your_table
    SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter
    

    暗黙的に変換されます

    UPDATE your_table
    SET your_date_column = TO_DATE(
                             '18-06-14',
                             ( SELECT value
                               FROM   NLS_SESSION_PARAMETERS
                               WHERE  parameter = 'NLS_DATE_FORMAT' )
                           );
    

    NLS_DATE_FORMATの場合 が一致しない場合、Oracleは例外を発生させます(パラメータは各ユーザーが設定できるため、一貫性があるとは限りません。特に、デフォルトの日付形式が地域と言語に依存する国際組織では)。

    値を更新する場合は、DATEを使用してください 文字列ではなくリテラル:

    UPDATE your_table
    SET your_date_column = DATE '2014-06-18';
    

    または、文字列を明示的に変換して、フォーマットモデルを提供します。

    UPDATE your_table
    SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );
    

    関数にパラメーターを渡す場合も同様です。 DATEを使用する 文字通り:

    BEGIN
      your_procedure(
        p_launch_date => DATE '2014-06-18'
      );
    END;
    /
    

    または、文字列を明示的に日付に変換します(暗黙の変換に依存しません):

    BEGIN
      your_procedure(
        p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
      );
    END;
    /
    



    1. Oracleでnullをnullに等しくする方法

    2. データベース設計における継承

    3. EclipseからMySQLに接続する(CDT)

    4. ROW_NUMBER() OVER (PARTITION BY ...) の使用に関する問題