我从客户端获取日期值有时包含额外数字的数据。这里有一些例子: 2/13/201733246
2/15/20179714
3/7/201712718
这些值作为字符串加载到临时表中,但我需要提取日期部分并将其作为日期加载到最终目标表中。
我尝试过使用正则表达式,并且可以选择日期的模式,但是我从那里停留了。如何选择不属于日期的值并将其删除?我可以用oracle regexp做到这一点吗?
我还尝试在月份和日期部分添加前导0,并且可以识别它只是一位数,但是如何将0与原始数字一起添加?
如果我使用substr,如果月份和日期都是2位数,则可以正常工作,但如果任何一个是单个数字,则会失败。
非常感谢任何帮助!!
答案 0 :(得分: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
这可以用不同的,更紧凑的方式重写,但我相信这很容易阅读。
regexp对于一个或两个数字([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')