更新:
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'