これは、方法かもしれない:
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')
問題があるになる必要があります。たとえば、あなたはいつも「/」を分けて日、月の年を区切っていますか?常に年は4桁で書かれていますか? – Aleksej
はい、日付は常にMM/DD/YYYYです。一貫性のない部分は、年に続くビットです。つまり、MM/DDの部分は1桁または2のいずれかです。 –