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

更新中のOracleの日付の破損

    更新:

    Oracleサポートサイトで、この特定のタイプのDATE破損への公開された参照は見つかりません。 (そこにあるかもしれませんが、私のクイック検索ではうまくいきませんでした。)

    • データベースの破損した日付をチェックするためのBaddateスクリプト[ID95402.1]
    • バグ2790435-並列SELECTと型変換を使用したシリアルINSERTは、破損したデータを挿入する可能性があります[ID 2790435.8]

    DUMP()関数からの出力は、日付値が実際に無効であることを示しています:

    Typ=12 Len=7: 120,110,11,18,13,0,16 
    

    分バイトは、ゼロではなく1〜60の値である必要があります。

    DATE値の7バイトは、世紀(+100)、年(+100)、月、日、時間(+1)、分(+1)、秒(+1)を順番に表します。

    DATE値がバインド変数としてPro*Cプログラムから提供されていたときにこのような無効なDATE値を見たのは、(バインド値が内部7バイト表現で提供され、通常の検証ルーチンを完全にバイパスしている場合のみ)無効な日付をキャッチする(例:2月30日)

    投稿したOracle構文を考えると、表示されている動作を期待する理由はありません。

    これは、偽の異常(メモリの破損?)であるか、これが再現可能である場合は、Oracleコードの欠陥(バグ)です。 Oracleコードの欠陥である場合、最も疑わしいのは、パッチが適用されていないリリースの「新しい」機能です。

    (CASTは、他のデータベースで長年使用されてきた標準のSQL関数であることを知っています。私は古い学校であり、Oracle構文のレパートリーに導入したことはありません。Oracleのバージョンがわからないのです。 CASTを導入しましたが、最初のリリースでCASTを使用していなかったでしょう。)

    大きな「赤い旗」(別のコメント投稿者が指摘した)は、CAST( datecol AS DATE)

    オプティマイザーがそれをdate_colと同等に扱うことを期待します...しかし、過去の経験から、TO_NUMBER( number_col ) オプティマイザによって実際にはTO_NUMBER( TO_CHAR ( number_col ) )として解釈されます。 。

    その不要なCASTでも同様のことが起こっているのではないかと思います。

    あなたが示したその1つのレコードに基づいて、問題は分または秒の値が「59」の値にあり、時間の値が「23」の場合はエラーが表示される可能性があると思われます。

    分、時、秒が0として格納されている場所を確認してみます:

    SELECT id, DUMP(activitydate)
      FROM newtable
     WHERE DUMP(activitydate) LIKE '%,0,%' 
        OR DUMP(activitydate) LIKE '%,0'
    


    1. MySQLとの明確な結合を行う方法

    2. プロシージャ/関数を使用せずにMySQLでループを実行できますか?

    3. DockerでMySQLコンテナをTomcatコンテナに接続できません

    4. SQL ServerでのATN2()の例