Regex PL/SQL中的日期格式替换。示例:从5y 6m 20d到050620

Regex PL/SQL中的日期格式替换。示例:从5y 6m 20d到050620,regex,oracle,plsql,Regex,Oracle,Plsql,我正在编写一个查询,其中需要执行日期格式转换以满足指定的要求 在我必须搜索的数据库中,日期格式类似于示例中的格式:5y 6m 10d,中间有空格,可选数字(10y 30d;1m 23d;6m也是有效的),并且它们总是按顺序排列(第一年、第二个月、第三天) 格式转换应如下所示: 10y 6m 10d=>100610 1y 10m 1d=>011001 6m 2d=>000602 因此,输出总是一个6位数字 我尝试在REGEX_SUBSTR中编写正则表达式来隔离令牌,然后将它们连接在一起,使用S

我正在编写一个查询,其中需要执行日期格式转换以满足指定的要求

在我必须搜索的数据库中,日期格式类似于示例中的格式:5y 6m 10d,中间有空格,可选数字(10y 30d;1m 23d;6m也是有效的),并且它们总是按顺序排列(第一年、第二个月、第三天)

格式转换应如下所示:

  • 10y 6m 10d=>100610
  • 1y 10m 1d=>011001
  • 6m 2d=>000602
因此,输出总是一个6位数字

我尝试在REGEX_SUBSTR中编写正则表达式来隔离令牌,然后将它们连接在一起,使用
SELECT REGEXP_SUBSTR(text_source,(\d+*y')FROM database
的类型,我还尝试使用
REGEX_REPLACE
函数。尽管如此,我无法在没有空格的情况下对每个令牌执行两位数的转换,也无法用另一个模式替换一个模式,我只能用另一个字符串替换该模式


尽管通过编写上面的函数,我能够输出不带空格的标记分隔。我无法获得整个转换。是否有可能编写一个正则表达式并将其与任何PL/SQL函数组合,以转换上面列表中所述的日期?我也愿意听到任何其他不涉及RegEx的解决方案,我只是认为在这里正确使用它们是明智的。

这里是一个简单的SQL解决方案

  • 您可以获得年、月和日的值,例如使用
    regexp\u substr
  • 使用
    nvl
    可以将值设置为
    0
    ,如果该值为空
  • 使用0对其进行lpad

下面是一个简单的SQL解决方案

  • 您可以获得年、月和日的值,例如使用
    regexp\u substr
  • 使用
    nvl
    可以将值设置为
    0
    ,如果该值为空
  • 使用0对其进行lpad
我希望它能起作用

declare
  myDate_ varchar2(50) := REPLACE('1y 10m 81d',' ','');
  year_ varchar2(50);
  month_ varchar2(50);
  day_ varchar2(50);
begin
       if instrb(myDate_,'y',1,1)>0 then
          year_ := lpad(regexp_substr(substr(myDate_,0,instrb(myDate_,'y',1,1)), '[^y]+',1 , 1),2,0);
       end if;
       if instrb(myDate_,'m',1,1)>0 then
          month_ := lpad(regexp_substr(substr(myDate_,instrb(myDate_,'y',1,1)+1,instrb(myDate_,'m',1,1)), '[^m]+',1 , 1),2,0);
       end if;
        if instrb(myDate_,'d',1,1)>0 then
          day_ := lpad(regexp_substr(substr(myDate_,instrb(myDate_,'m',1,1)+1,instrb(myDate_,'d',1,1)), '[^d]+',1 , 1),2,0);
       end if;
       dbms_output.put_line(year_||month_||day_);
end;
我希望它能起作用

declare
  myDate_ varchar2(50) := REPLACE('1y 10m 81d',' ','');
  year_ varchar2(50);
  month_ varchar2(50);
  day_ varchar2(50);
begin
       if instrb(myDate_,'y',1,1)>0 then
          year_ := lpad(regexp_substr(substr(myDate_,0,instrb(myDate_,'y',1,1)), '[^y]+',1 , 1),2,0);
       end if;
       if instrb(myDate_,'m',1,1)>0 then
          month_ := lpad(regexp_substr(substr(myDate_,instrb(myDate_,'y',1,1)+1,instrb(myDate_,'m',1,1)), '[^m]+',1 , 1),2,0);
       end if;
        if instrb(myDate_,'d',1,1)>0 then
          day_ := lpad(regexp_substr(substr(myDate_,instrb(myDate_,'m',1,1)+1,instrb(myDate_,'d',1,1)), '[^d]+',1 , 1),2,0);
       end if;
       dbms_output.put_line(year_||month_||day_);
end;

您的解决方案不起作用,例如,对于字符串
6m 2d
10y 2d
为什么需要
regexp\u substr
substr
?您可以使用一个
substr
来执行此操作。例如,对于字符串
6m 2d
10y 2d
您为什么需要
regexp\u substr
substr
?您可以使用一个
substr