关于sql instr函数

时间:2011-03-31 06:00:05

标签: sql oracle plsql oracle10g

Oracle 10g是db。 提取日期时,以下查询失败。

SELECT  TO_CHAR ( TO_DATE ( SUBSTR (file_name , INSTR (file_name , '_', -1, 2)+ 2, 8), 'YYYYMMDD'), 'DD-MM-YYYY')  from dual;

我注意到我们收到了以下两种不同命名格式的文件名。

  

660.ASSD.0063.20100923.0409.PTH2.IAC1.gcr_H201009231416151671_bbor.ddr   660.ASSD.M2K_20110309121547_489.ddr

对于一个文件,上述查询有效。另一个文件是660.ASSD.M2K_20110309121547_489.ddr 它提取“01103091”并执行to_date失败。如何修改此查询,使其适用于两种文件格式。

2 个答案:

答案 0 :(得分:4)

使用REGEXP_SUBSTR

select TO_CHAR(TO_DATE(SUBSTR(REGEXP_SUBSTR('660.ASSD.0063.20100923.0409.PTH2.IAC1.gcr_H201009231416151671_bbor.ddr', '\d{14,17}'), 0, 8), 'yyyymmdd'), 'dd-mm-yyyy')
  from dual;
select TO_CHAR(TO_DATE(SUBSTR(REGEXP_SUBSTR('660.ASSD.M2K_20110309121547_489.ddr', '\d{14,17}'), 0, 8), 'yyyymmdd'), 'dd-mm-yyyy')
  from dual;

答案 1 :(得分:2)

您还可以使用REGEXP_REPLACE从文件名中删除字母。

SELECT  TO_CHAR ( TO_DATE ( SUBSTR (regexp_replace(file_name, '[A-Z][a-z]', '')
                           , INSTR (regexp_replace(file_name, '[A-Z][a-z]', '') , '_', -1, 2)+ 1, 8), 'YYYYMMDD'), 'DD-MM-YYYY')
  FROM dual;