这可能是一个办法:
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位。 –