当日期值后面有额外值时,从字符串中提取日期

时间:2017-04-04 15:32:51

标签: regex oracle date

我从客户端获取日期值有时包含额外数字的数据。这里有一些例子: 2/13/201733246

2/15/20179714

3/7/201712718

这些值作为字符串加载到临时表中,但我需要提取日期部分并将其作为日期加载到最终目标表中。

我尝试过使用正则表达式,并且可以选择日期的模式,但是我从那里停留了。如何选择不属于日期的值并将其删除?我可以用oracle regexp做到这一点吗?

我还尝试在月份和日期部分添加前导0,并且可以识别它只是一位数,但是如何将0与原始数字一起添加?

如果我使用substr,如果月份和日期都是2位数,则可以正常工作,但如果任何一个是单个数字,则会失败。

非常感谢任何帮助!!

1 个答案:

答案 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')