Regex PL/SQL中的日期格式替换。示例:从5y 6m 20d到050620
我正在编写一个查询,其中需要执行日期格式转换以满足指定的要求 在我必须搜索的数据库中,日期格式类似于示例中的格式:5y 6m 10d,中间有空格,可选数字(10y 30d;1m 23d;6m也是有效的),并且它们总是按顺序排列(第一年、第二个月、第三天) 格式转换应如下所示: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
- 10y 6m 10d=>100610
- 1y 10m 1d=>011001
- 6m 2d=>000602
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