2011-12-07 9 views
0

Oracle 10gデータベースの一部のデータ、特にタイムスタンプ情報の一括更新と読み取りに取り組んでいます。ビジネス要件のためMM/DD/YYYY HH24:MI:SS形式からYYYY-MM-DD HH24:MI:SS形式に変換する必要がありました。同様に、タイムスタンプはビジネス要件のためネイティブのdatetimeの代わりにVARCHARとして保存されます。Oracle 10gでの不正な日時スタンプの検索

残念ながら、データの選択操作を実行する際に問題が発生しました。

私は次のselectを実行したときに具体的に、私はORA-01861を受け取る:リテラルが書式文字列と一致しません:

SELECT datetime_stamp 
    from entrytable 
where 
    to_date(datetime_stamp, 'YYYY-MM-DD HH24:MI:SS') 
    between 
    TO_DATE('11/27/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
    and 
    TO_DATE('12/06/2011 23:59:59', 'MM/DD/YYYY HH24:MI:SS') 
    and rownum < 1000 

私が悪いの引数はTO_DATE(datetime_stamp、「YYYY-MM-DD HH24であることを確認しました:MI:SS ')が、今私は悪い行を見つけようとするために解析するために400k行のデータを持っています。

ORA-01861エラーを生成している行をOracleが戻す方法はありますか?

REGEXP_LIKEを使用して[0-9] [0-9] [0-9] [0-9] - [0-9] [0-9] - [ 0-9] [0-9] [0-9] [0-9]:[0-9] [0-9]:[0-9] [0-9]表現。

+0

以下の機能を実行する必要があります。しかし、タイムスタンプ/日付をタイムスタンプ/日付データ型に格納する方がはるかに良いでしょう。それはあなたにこの煩わしさを救うでしょう。 – Ben

+0

ウィッシュ私はベンができる...私ができることを望む。 – Gyrfalcon2138

答えて

4
create function td(s varchar2) return number is 
begin 
    if to_date(s, 'YYYY-MM-DD HH24:MI:SS') is not null then return 1; end if; 
    return null; 
exception 
    when others then return 0; 
end; 

、その後

select datetime_stamp from entrytable where td(datetime_stamp) = 0 
+0

ちょっとハル - 自分のコードをコピーしてOracle Explorerに貼り付けようとしましたが、「ORA-00900:無効なSQL文です。トランザクションがロールバックされました。トラブルシューティングの方法がわかりません。私は完全な権利を持っていますが、私のオラクルコンソールはちょっと変わっています。たとえば、カーソルをうまく扱えないことがわかります。これは関数を定義しようとすると問題になると思いますか? – Gyrfalcon2138

+0

SQL DeveloperまたはSQL * Plusを使用して関数 –

+0

+1を作成しようとすると、「関数の作成または置換」が有効になり、SQL * Plusで実行されている場合は 'end;の後に'/'が必要です。 – Ben

1

タイムスタンプがVARCHARの代わりに、ビジネス要件

うわー、これを行うためのひどい引数に によるネイティブdatetime型として格納されています。データベースの開発者は、日付を格納するためにVARCHARを使用する必要があります。これは、このスキーマを設計した人の無知か怠惰から来ている必要があります。日付として定義することができない場合は、日付ではなく、数字や記号の文字列を使用します。任意の日付関数、比較などを行うことの損失はもちろんのこと、言わないでください!

とにかく、この問題をプロジェクトマネージャーなどにエスカレーションして、誰かが日付やタイムスタンプに変更することを優先するとします。 VARCHARフィールドをクリーンアップしても、to_dateをオンザフライで変換しようとしている場合は、確実にこれを再度実行します。

文字列を整理するのではなく、正しく修正してください。

+0

問題は、ほとんどの列は、システム管理者が特定のデータ型として定義できる汎用列であることを意味しています。したがって、このdatetime_stamp列は、実際には整数値、文字列、または何でもかまいません。私は設計どおりの製品を扱っており、データベースのスキーマを変更する能力はありません。 – Gyrfalcon2138

+0

ああ、止めて、私を殺して...本当に。いくつかの "天才"はこれが "ジェネリック"であることが最善であると判断しました。だから、ここではwtfがそこにあるかどうかわかりません。結局のところ、データベースは単に「データ」と呼ばれる「もの」の大きな愚かな投棄地です。ああ。申し訳ありませんが、それはまだそれを正しい前進にするための言い訳ではありません。運が良かった。 – someuser2

+0

私は、毎回スキーマを再構築することなく、特定の顧客にカスタマイズできる製品を作成することが目標だと考えています。ある程度意味がありますが、私はたいていMSSQLの人であり、Oracleは特に日付スタンプに関して多くの選択肢があるようです。 – Gyrfalcon2138

関連する問題