如何从oracle中的长字符串Name列中提取日期

时间:2015-10-16 16:40:02

标签: mysql oracle

我的表格中有列' ID',' File_Name'

 ID     File_Name  
 123    ROSE1234_LLDAtIInstance_03012014_04292014_190038.zip   
 456    ROSE1234_LLDAtIInstance_08012014_04292014_190038.zip

我只需要提取文件名中给出的第一个日期。

必需:

 ID     Date  
 123    03012014
 456    08012014

3 个答案:

答案 0 :(得分:0)

这是一种方法,假设第二个_之后的8个字符始终为真。

找到第一个_的位置然后使用第一个_ + 1的位置查找第二个_的位置然后它在第二个_

之后查找8个字符
SELECT Id
  , substr(File_name, instr(File_name,'_',instr(File_name,'_')+1)+1,8) as Date     
FROM Table

或 更优雅的方法是使用RegExp_Instr函数,它不需要嵌套instr。

SELECT Id, substr(File_name,REGEXP_INSTR(FileName,'_',1,2)+1,8) as date 
FROM dual;

答案 1 :(得分:0)

使用对REGEXP_SUBSTR()的简化调用:

SQL> with tbl(ID, File_name) as (
  2    select 123, 'ROSE1234_LLDAtIInstance_03012014_04292014_190038.zip' from dual
  3    union
  4    select 456, 'ROSE1234_LLDAtIInstance_08012014_04292014_190038.zip' from dual
  5  )
  6  select ID,
  7         REGEXP_SUBSTR(File_name, '_(\d{8})_', 1, 1, NULL, 1) "Date"
  8  from tbl;

        ID Date
---------- ----------------------------------------------------
       123 03012014
       456 08012014

SQL>

对于11g,click here for the parameters to REGEXP_SUBSTR( )

编辑:将其设为虚拟列将是另一种处理它的方法。感谢Epicurist的帖子。一旦提交了ID和文件名,虚拟列将包含一个保存文件名日期的日期值。像这样添加:

  alter table X_TEST add (filedate date generated always as (TO_DATE(REGEXP_SUBSTR(Filename, '_(\d{8})_', 1, 1, NULL, 1), 'MMDDYYYY')) virtual);

所以现在只需插入ID和文件名,提交就可以了。请注意它是只读的。

enter image description here

答案 2 :(得分:0)

为什么不简单地将日期放在单独的列中?例如。你可以查询(索引)日期。理论上说日期是文件的属性。它是关于避免错误,可维护性等。 zip文件中有什么?我想的Excel表格:-)