這可能是一個辦法:
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
這可以被重新用不同的,更緊湊,辦法,但我相信這是易於閱讀。
正則表達式看起來是一個或兩個數字([0-9]{1,2}
)後面跟一個/
的序列的兩倍,然後是一年中完全4位數的序列([0-9]{4})
。
的另一種方式,不使用正則表達式,可能是以下幾點:
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')
的問題是,如果你有一個可以依靠的模式。例如,你是否總是用「/」分隔日,月?總是用四位數字寫年? – Aleksej
是的,日期總是MM/DD/YYYY。不一致的部分是今年之後的比特。也就是說,MM/DD部分可能是1位或2位。 –