2011-03-31 47 views
1

Oracle 10g是db。 提取日期時,下面的查詢失敗。關於sql instr函數

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

您還可以使用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; 
+0

非常感謝您的信息。如果我將正則表達式定義爲'[A-Z] [a-z]',它就不起作用。所以我將它改爲'[A-Z] | [a-z]' – Arav 2011-04-01 00:41:06

+0

[A-Za-z]也應該起作用。 – redcayuga 2011-04-04 19:15:35

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; 
+0

非常感謝您的信息。 '\ d {14,17}'尋找什麼? – Arav 2011-03-31 23:08:32

+0

@Arav:它是:'\ d' ==一個數字,'{14,17}' - 連續14到17位數字 – zerkms 2011-04-01 01:53:31

+0

非常感謝您的信息。 – Arav 2011-04-04 04:16:15