2017-04-04 15 views
0

時々余計な数字が含まれる日付値を持つクライアントからデータを取得します。 2/13/201733246日付値の後ろに余分な値がある場合、文字列から日付を抽出する

2/15/20179714

3/7/201712718

これらの値は、文字列としてステージング表にロードされますが、私がする必要がある:ここではいくつかの例があります日付部分を抽出し、最終的な宛先テーブルに日付としてロードします。

正規表現を使用しようとしましたが、日付のパターンを選択できますが、そこから立ち往生しています。日付の一部ではない値を選択して取り除くにはどうすればよいですか? oracle regexpでこれを行うことはできますか?

また、月と日付の部分に先行する0を追加しようとしましたが、それが1桁の数字であることはわかりますが、元の数字とともに0を追加するにはどうすればよいですか?

substrを使用すると、月と日付の両方が2桁の場合に機能しますが、いずれかが1桁の場合は失敗します。

ご協力いただければ幸いです。

+0

問題があるになる必要があります。たとえば、あなたはいつも「/」を分けて日、月の年を区切っていますか?常に年は4桁で書かれていますか? – Aleksej

+0

はい、日付は常にMM/DD/YYYYです。一貫性のない部分は、年に続くビットです。つまり、MM/DDの部分は1桁または2のいずれかです。 –

答えて

3

これは、方法かもしれない:

with inputData(str) as (
    select '2/13/201733246' from dual union all 
    select '2/15/20179714' from dual union all 
    select '3/7/201712718' from dual 
) 
select str, regexp_substr(str, '^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}') 
from inputData 

は、これは別の、よりコンパクトな、方法で書き換えることができますが、私はこれが読みやすいと考えています。

正規表現は、正確に4桁([0-9]{4})のシーケンスのための年のために、/に続く1または2桁([0-9]{1,2})の配列のために二倍になります。

もう一つの方法は、正規表現を使用せずに、次のようになります。

substr(str, 1, instr(str, '/', 1, 2) +4) 

これは/の第二の発生を探し、ための第二/プラス4文字までの最初の文字から部分文字列を与えます年。

結果:

SQL> with inputData(str) as (
    2  select '2/13/201733246' from dual union all 
    3  select '2/15/20179714' from dual union all 
    4  select '3/7/201712718' from dual 
    5 ) 
    6 select str, 
    7   regexp_substr(str, '^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}') str1, 
    8   substr(str, 1, instr(str, '/', 1, 2) +4) str2 
    9 from inputData; 

STR     STR1  STR2 
-------------------- ---------- ---------- 
2/13/201733246  2/13/2017 2/13/2017 
2/15/20179714  2/15/2017 2/15/2017 
3/7/201712718  3/7/2017 3/7/2017 

あなたがDATE形式で結果を得るために必要がある場合は、使用することを決定した方法は、あなたが上に示した文字列の結果を変換するto_dateを使用する必要がどんなに。例えば

regexp_substr(str, '^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}') はあなたが頼ることができるパターンを持っている場合 to_date(regexp_substr(str, '^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}'), 'mm/dd/yyyy')

+0

これは完璧です!私はあなたが提供した正規表現を使用しただけでなく、私は起動するために何かを学んだ。ありがとうございました! –

+2

質問はDATEを抽出する方法であるため、式をTO_DATE、つまり 'TO_DATE(regexp_substr(str、 '^ [0-9] {1,2}/[0-9] {1,2}/[0-9] {4} ')、' MM/DD/YYYY ') 'を返します。 –

+0

TO_DATE部分に言及してくれてありがとう。私はその省略によって何をしたかを完全に示さなかったが、おそらくこれを達成するために他の誰かを助けるだろう。 –

関連する問題