嗨,我有下面的文字,并从下面的文字中获取文件名。但还需要提取日期。但我希望将其作为子字符串函数,而不是硬编码,以便可以从文本本身中提取日期。
select
SUBSTR(fname, INSTR(fname, '_', -1)+1) as fname,
'20181217' as fdate
from
(
select '/home/dir/file_name_20181217_product.csv' as fname from dual
);
答案 0 :(得分:2)
假设该日期始终出现在第一个下划线(“ fname”开始的位置)之前,且该数字为8位数字,则可以执行以下操作:
select
SUBSTR(fname, INSTR(fname, '_', -1)+1) as fname,
SUBSTR(fname, INSTR(fname, '_', -1)-8,8) as fdate
from
(
select '/home/dir/file_name_20181217_product.csv' as fname from dual
);
FNAME fdate
----------- --------
product.csv 20181217
答案 1 :(得分:1)
您始终可以使用regexp_substr()
:
replace(regexp_substr(fname, '_[0-9]{8}_', 1, 1), '_', '') as date
对于文件名:
regexp_substr(fname, '[^_]+$', 1, 1) as fname,
答案 2 :(得分:0)
如果您想“按原样”获取日期,那么这可能会有所帮助:
SQL> select
2 SUBSTR(fname, INSTR(fname, '_', -1)+1) as fname,
3 regexp_substr(fname, '\d+') as fdate --> this
4 from (select '/home/dir/file_name_20181217_product.csv' as fname from dual);
FNAME FDATE
----------- --------
product.csv 20181217
SQL>
答案 3 :(得分:0)
这将起作用:
select
SUBSTR(fname, INSTR(fname, '/',1,3)+1),
instr(fname,'_')-INSTR(fname, '/',1,3)+1)) as fname,
to_date(substr(fname,instr(fname,'_',1)+1,8),YYYYMMDD) as fdate
from
(
select '/home/dir/file_name_20181217_product.csv' as fname from dual
);