2017-01-11 5 views
1

(postgreSQL Datenbank)SQL Klonen und die Umwandlung einer Datumsspalte

ich eine Datumsspalte, die zuerst im Format yyyy-mm-dd 'zu sein scheint, wie ich würde konvertieren, daß die Spalte' JJJJM '.

Danach möchte ich diese Spalte zu einer anderen Spalte in der gleichen Tabelle klonen, die ich "Jahr" nennen würde, und ich müsste das nur im Format "JJJJ" haben.

Ich habe noch eine einfache Lösung zu finden, die auf meinen Fall zutreffen würde und das ist grundlegend genug, da ich SQL im Allgemeinen neu bin.

Am Ende würde ich die Spalten mag so sein (die anderen vorhandenen Spalten ohne)

date /*already exists*/ year /*need to create*/ 
    201501     2015 
    201501     2015 
    201502     2015 
    201606     2016 

Prost

+1

Warum speichern Sie Daten in einer Varchar (oder Integer) -Spalte? Warum nicht einen echten 'date' Datentyp verwenden? Wenn Sie das haben, können Sie das Datum in einem beliebigen Format _display_ anzeigen –

+0

Die Datumsspalte ist ein 'Datum' Datentyp jetzt, ich war einfach nicht sicher, wie man dann in eine andere Spalte umwandelt, aber nur den Jahresanteil nimmt, Vielen Dank. – MG97

+0

"* scheint * zu sein" ist korrekt, die Postgresql-Datumsspalte hat den Typ Integer (auf der Festplatte), aber für die Darstellung sieht sie wie Jahre Monate und Tage aus. – Jasen

Antwort

2

Würden diese Hilfe?

Dies verwendet die integrierte Datumsformatierung in der TO_CHAR-Funktion. Ich bin nicht ganz mit postgresql tho 'zu Hause, also müssen einige Feinabstimmungen getan werden.

UPDATE 
    TABLENAME 
SET 
    year = TO_CHAR(date, 'YYYY'), 
    date = TO_CHAR(date, 'YYYYMM'); 

Wenn die Spalte „Jahr“ nicht bereits vorhanden ist, werden Sie es mit einer ALTER TABLE Anweisung erstellen müssen zuerst

ALTER TABLE [table_name] ADD COLUMN [column_name] [data_type] {collation} {column_contstraint}; 

Ich würde empfehlen, die documentation für die richtige Anwendung zu überprüfen.

EDIT: Wenn Sie sich Sorgen machen über die Zeit, die es dauern würde, um alle Zeilen zu aktualisieren (Ich sah Sie eine andere Antwort kommentiert, dass Sie rund 2 Millionen Datensätze hatten), dann empfehle ich this post.

Es erklärt, dass es möglicherweise schneller ist, die Tabelle von Grund auf mit den Daten zu erstellen, anstatt jede einzelne Zeile zu aktualisieren.

+0

Dies wird nicht meine Spalte erstellen, oder wird es? Ich habe die Spalte selbst nicht erstellt, da ich nicht sicher bin, wie die Formatierung der Spalte "Jahr" eingestellt werden soll, Prost. Auch meine Spalte hat über 2 Millionen Zeilen. Ich habe gehört, dass die Verwendung der update/set-Methode auf dieser Ebene recht ressourcenintensiv ist. Ist das wahr? – MG97

+0

Oh, mein schlechtes dann. Nun, Sie müssten zuerst die Spalte mit einem 'ALTER TABLE ADD COLUMN ...' Befehl erstellen, den Sie einmal ausführen würden, dann können Sie oben die Anweisung 'UPDATE' anwenden. Ich bearbeite meine Antwort damit. –

+0

@ MG97 Ich habe einige zu meiner Antwort hinzugefügt, einschließlich eines Links zu "wie man vorgeht" Daten zu aktualisieren, wenn der Tisch wirklich groß ist. –

2

die neue Spalte hinzuzufügen,

laufen
ALTER TABLE mytable ADD year character varying(4); 

Das sollte schnell beendet werden, wenn keine Sperren auf dem Tisch sind.

die Daten zu ändern,

laufen Sie
UPDATE mytable 
SET date = substr(date, 1, 4) || substr(date, 6, 2), 
    year = substr(date, 1, 4); 
+0

Hallo, danke für deine Antwort, wird dies auch meine Datumspalte erstellen? – MG97

+0

Auch meine Spalte hat über 2 Millionen Zeilen, ich habe gehört, dass die Verwendung der update/set-Methode auf dieser Ebene recht ressourcenintensiv ist, stimmt das? – MG97

+0

Ich habe Anweisungen zum Erstellen einer Spalte hinzugefügt. Zwei Millionen Zeilen sind nicht so viele, also mach dir keine Sorgen. Natürlich ist dies ressourcenintensiv, da es die gesamte Tabelle neu schreibt, aber das ist unvermeidbar, wenn Sie alle Zeilen ändern wollen. –

Verwandte Themen