2017-05-10 1 views
1

Ich habe eine PostgreSQL-Datenbank mit einer Informationstabelle mit Kommentaren über Personen.Ändern Datumsformat in einer Varchar-Spalte in PostgreSQL 9.3

Ein Beispiel ist Mr X, born the 18/12/1953 in Y...

Ich mag das Format Datum ändern ISO 8601 (JJJJ-MM-DD) mit einer einzigartigen PostgreSQL Anfrage oder Methode.

Ich kann die Daten in meiner Datenbank erkennen: '(\d{2})/(\d{2})/(\d{4})'.

Was ist der beste Weg, um dieses Muster zu ersetzen?

Ich dachte über eine regex_replace gemischt mit einem Split, aber es scheint zu kompliziert, ich bin mir sicher, es gibt einen einfacheren Weg.

Wenn jemand ein gutes Trinkgeld hat, nehme ich es!

Dank

+0

, wenn Sie etwas Maske müssen übereinstimmen, regexp am besten passen Ich denke, –

+0

Ist das Datumsformat persistent? Gibt es andere _non-date_ Daten mit ähnlichem Muster? – Rahul

+0

Haben Sie schon versucht, die Aufgabe zu lösen? Irgendwelche Muster mit ['regexp_replace'] (https://www.postgresql.org/docs/current/static/functions-string.html)? –

Antwort

0

Nehmen wir an, Sie XX/XX/XXXX Datum artigen Teil in Ihrem Eingang haben, der immer ein Datum ist. Dann verwenden, was Sie können eine einzelne REGEXP_REPLACE mit einem Muster mit entsprechenden Rückreferenzierungen im Ersetzungsmuster einfangenden Gruppen enthält, in der gewünschten Reihenfolge angeordnet und mit dem gewünschten Separatoren:

REGEXP_REPLACE(s, '(\d{2})/(\d{2})/(\d{4})', '\3-\2-\1', 'g') 

Hinweis: Sie das gesamte Muster umschließen können mit \y, eine Wortgrenze, wenn Sie diese Zeichenfolgen als ganze Wörter abgleichen müssen, '\y(\d{2})/(\d{2})/(\d{4})\y'. \d{2} entspricht zwei Ziffern, \d{4} entspricht vier Ziffern. (...) erstellt eine nummerierte Erfassungsgruppe (beginnend mit ID 1 von links nach rechts) und deren Inhalt wird mit \n Rückverweisen referenziert. 'g' ersetzt alle Vorkommen in der Zeichenfolge.

Ein online test:

CREATE TABLE table1 
    (s character varying) 
; 

INSERT INTO table1 
    (s) 
VALUES 
    ('Mr X, born the 18/12/1953 in Y...'), 
    ('Mr Y, died the 18/12/2053 in Y...') 
; 
select REGEXP_REPLACE(s, '\y(\d+)/(\d+)/(\d+)\y', '\3-\2-\1', 'g') as Results from table1; 

enter image description here

+1

Vielen Dank! Ich kannte das Nummernaufnahmegruppen-System nicht, ich hatte nur das Regex-Muster. – Pawus

+0

Was war das Muster? Bitte teilen. Meine Antwort könnte dann hilfreicher sein. –

+0

Und ich bestätige, dass es nur Daten in diesem Format in meiner Tabelle gibt. Aber nur zu wissen, würde das Ändern des Regex-Musters, um Datumsformate zu erfassen, den Fall lösen, richtig? Etwas wie: 'REGEXP_REPLACE (s, '\ y ()/()/() \ y', '\ 3- \ 2- \ 1', 'g')' – Pawus

Verwandte Themen