Относительно функции sql instr - PullRequest
1 голос
/ 31 марта 2011

Oracle 10g - это дБ.Приведенный ниже запрос не выполняется при извлечении даты.

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 ]

4 голосов
/ 31 марта 2011

Использование 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;
2 голосов
/ 31 марта 2011

Вы также можете использовать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...