2016-03-21 4 views
0

Eine Spalte enthält den Namen einer speziellen Art von Dateien, die wie folgt benannt sind: "kontrolrapport-2015.12.23-10.19.05.pdf". Ich möchte das Datum extrahieren, das ist "2015-12-23 10:19". Ich dachte, es wäre ein Stück Kuchen, aber es dauert ein bisschen mehr, als ich herausfinden kann.
Dies ist, wie weit ich
select 'kontrolrapport-2015.12.23-10.19.05.pdf' as file_name, regexp_replace('kontrolrapport-2015.12.23-10.19.05.pdf','(\w*)-', '') as date_like from dual;Oracle Regexp - formatieren Sie eine Zeichenfolge zu Datum-ähnliche Informationen

Antwort

1

Basierend auf Ihrem Beispiel regex, Ich gehe davon aus, dass ein variabler Präfix in Ihrem Dateinamen gefolgt von einem Bindestrich, gefolgt von Datum, gefolgt von Zeit und dann eine Dateierweiterung.

Hier ist die regex ich jedes Stück Information zu extrahieren verwendet -

with f as (SELECT 'kontrolrapport-2015.12.23-10.19.05.pdf' AS file_name, 
     '([^-]+)-([0-9\.]+)-([0-9\.]+)\.([a-z]+)' AS regex 
    FROM DUAL) 
select f.file_name, 
     regexp_substr (f.file_name, f.regex, 1, 1, 'i', 1) as prefix_part, 
     regexp_substr (f.file_name, f.regex, 1, 1, 'i', 2) as date_part, 
     regexp_substr (f.file_name, f.regex, 1, 1, 'i', 3) as time_part, 
     regexp_substr (f.file_name, f.regex, 1, 1, 'i', 4) as file_extension 
from f; 

Beginnen Sie mit diesem und vielleicht auf sie weiter zu verbessern. Ich würde [a-z] und [0-9] mit POSIX-Klassen ersetzen.

+0

Das ist genau das, wonach ich suche. :-) Auch wenn du regexp_substr verwendest und nicht - wie ich dachte - passender wäre - regexp_replace. Das nächste Ding für mich ist, zu entdecken, wie man POSIX-Klassen benutzt. Vielen Dank. –

0

bekommen Warum Sie substr und to_date Funktionen nicht verwenden it'easier

TO_DATE (Substr (Dateiname, 13,15), 'yyyy.mm.dd-hh24. mi ')

Rückreisedatum

+0

Ich mag es, es einfach zu halten. Unter diesem Gesichtspunkt ist Ihr Vorschlag sehr nützlich. Aber ich suche nach etwas, das für kleinere Varianten des Dateinamens robust sein wird, was meines Erachtens ein Problem mit dem substr-Ansatz sein wird. Aber danke für deine Zeit! –

1

würde Wenn das Format vorhersehbar ist, könnten Sie tun:

select to_date(substr('kontrolrapport-2015.12.23-10.19.05.pdf', 16,19), 'YYYY.MM.DD-HH.MI.SS') from dual; 

oder sogar

select to_date(replace(replace('kontrolrapport-2015.12.23-10.19.05.pdf', 'kontrolrapport-',''),'.pdf','') , 'YYYY.MM.DD-HH.MI.SS') from dual; 

und wenn Sie es als String angegeben in Ihrer Frage wollen, wie etwa eine der oben in einem to_char wie umfassend:

select to_char(to_date(substr('kontrolrapport-2015.12.23-10.19.05.pdf', 16,19), 'YYYY.MM.DD-HH.MI.SS'), 'YYYY-MM-DD HH:MI') 
+0

Ich schätze die substr-Einfachheit, aber wie du schreibst: Das Format ist vielleicht nicht 100% vorhersehbar, also gehe ich immer noch auf eine Regexp-Lösung. Aber danke für deine Zeit. –

Verwandte Themen