いくつかの日付といくつかのタイムスタンプがあります。これは、データの整合性が低いシステムからデータをインポートする際の問題です。
2つのオプションがあります:インポートする前にデータをクリーンアップするか、インポート中にクリーンアップします。
事前にデータをクリーンアップするには、さまざまな方法があります。1つのオプションは、正規表現をサポートするテキストプロセッサまたはIDEを使用し、検索と置換を実行して、秒の小数部が不足している値を修正することです。
インポート中にクレンジングする最も簡単な方法は、(SQLローダーではなく)外部テーブルを仲介として使用することです。外部テーブルは非常に優れたオブジェクトであり、データベース内にあるかのようにOSファイル(CSVなど)の構造化データを操作できます。SQLローダーに対する外部テーブルの大きな利点は、DMLステートメントでそれらを使用できることです。 詳細をご覧ください。
これを機能させるには、その列をvarchar2として使用して外部テーブルを定義する必要があります。また、文字列を取得してタイムスタンプに変換する関数を作成する必要があります。
create or replace function fix_ts (str in varchar2)
return timestamp
is
is_a_date exception;
pragma exception_init(is_a_date, -1840);
rv timestamp;
begin
begin
rv := to_timestamp(str);
exception
when is_a_date then
rv := to_timestamp(str)||'.000000000';
end;
return rv;
end;
次に、次のようにターゲットテーブルにレコードを挿入できます。
insert into target_table
(id, created, whatever)
select id
, fix_ts(created)
, whatever
from external_table;
これが1回限りのデータクレンジングの演習である場合は、IDEでデータを変更する方がよいでしょう。これが通常のデータフィードである場合は、より自律的で堅牢なものを構築する価値があります。
あなたのコメントによると、3番目のオプションがあります:エクスポートプロセス中にデータを修正するためにソースシステムを取得することです。これは、多くの要因に応じて、簡単な場合と難しい場合があります。多くの場合、政治的な問題は技術的な問題よりも解決が困難です。