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

cx_Oracle'ORA-01843:有効な月ではありません'Unicodeパラメータを使用

    これは実際にはOracle10.5.0.2および11.2.0.1のバグです。

    バグは次のように再現できます:

    セッションでNLS_TIMESTAMP_FORMATを設定します。

    Unicodeデータを使用して暗黙的または明示的なTO_DATE変換を実行します。

    次に、Unicodeデータを使用した暗黙的または明示的なTO_TIMESTAMPにより、タイムスタンプ形式の内部リセットがトリガーされます。

    連続するすべてのTO_TIMESTAMPは失敗し、タイムスタンプのTO_CHARは無効な出力を生成します。

    動作をテストするためのコードは次のとおりです。

    ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
    ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
    
    REM --- WORKS:
    SELECT TO_TIMESTAMP('2013-06-24 18:15:10.312') FROM DUAL;
    
    REM --- WORKS:
    SELECT TO_DATE('2013-06-24 18:15:10') FROM DUAL;
    
    REM --- WORKS:
    SELECT TO_TIMESTAMP('2013-06-24 18:15:10.312') FROM DUAL;
    
    REM --- WORKS:
    SELECT TO_TIMESTAMP(x) FROM (SELECT CAST('2013-06-24 18:15:10.312' AS NVARCHAR2(30)) AS X FROM DUAL);
    
    REM --- WORKS:
    SELECT TO_DATE(x) FROM (SELECT CAST('2013-06-24 18:15:10' AS NVARCHAR2(30)) AS X FROM DUAL);
    
    REM --- WORKS:
    SELECT TO_TIMESTAMP('2013-06-24 18:15:10.312') FROM DUAL;
    
    REM !!! FAILS!
    SELECT TO_TIMESTAMP(x) FROM (SELECT CAST('2013-06-24 18:15:10.312' AS NVARCHAR2(30)) AS X FROM DUAL);
    
    REM !!! FAILS!
    SELECT TO_TIMESTAMP('2013-06-24 18:15:10.312') FROM DUAL;
    
    REM --- WORKS:
    SELECT TO_DATE('2013-06-24 18:15:10') FROM DUAL;
    


    1. 結果セットの最後のレコードを取得します

    2. 最大長で休止状態の列の長さを設定する方法

    3. PHP PDO:ステートメントの再準備はパフォーマンスにどのように影響しますか

    4. SQL Serverの2つの日付の間のすべての週の開始日と終了日を取得するにはどうすればよいですか?