DateStyle parameter richtig setzen

Ich habe eine leere Tabelle mit einer Spalte, bei der ich den DATE Datentyp definiert habe. Meine Daten, die ich für diese Spalte einlese, sind im MDY Format. Beim Einlesen bekomme ich aber die Fehlermeldung:

FEHLER:  Datum/Zeit-Feldwert ist außerhalb des gültigen Bereichs: »12/31/9999«
TIP:  Möglicherweise benötigen Sie eine andere »datestyle«-Einstellung.

Ich bin davon ausgegangen, dass der DATE Datentyp standardmässig das Format MDY hat…warum meckert er da?

Wie und wo müsste ich den DateStyle definieren? Habe in der Dokumentation nachgeschaut, aber finde den richtigen Abschnitt nicht wo das beschrieben ist.

was sagt

show datestyle;

?

Hallo akretschmer, zum Glück gibt’s dich noch :slight_smile:

show datestyle sagt:
ISO, DMY

edb=*# set datestyle = MDY;
SET

edb=*# select '12/31/9999'::date;
        date         
---------------------
 9999-12-31 00:00:00
(1 row)

edb=*#

Heisst das, die zu importierenden Daten müssten im Format YYYY-MM-DD sein, damit ich die Spalte im DATE Format mit Daten befüllen kann?

PostgreSQL: Documentation: 9.5: Date/Time Types

In der Dokumentation habe ich eben gesehen, dass MM/DD/YYYY auch ein gültiges Input-Format ist…so liegen eben die Daten in meinem .csv-File im Moment auch vor.

Was macht dein Befehl genau?

Du hast derzeit DMY, und so erwartet PG das auch.

Ok, habe jetzt

ALTER DATABASE meine_Datenbank SET datestyle TO "ISO, MDY";

verwendet, aber SHOW DATESTYLE; zeigt immer noch ISO, DMY an.

Sorry, verstehe nicht ganz, was mit edb=*# SET DATESTYLE = MDY; genau passiert. Bringt das etwas, solange ich noch keine Daten in der Tabelle bzw. der Spalte habe?

Hrm, vielleicht für die falsche Datenbank gesetzt, oder TX nicht commited, …

Mit dem SET-Befehl habe ich das in meiner aktuellen Session gemacht.

Datenbank sollte die richtige sein, die ich angegeben habe. Was meinst du mit TX nicht committed? Das Semicolon zum Beenden des Befehls? Doch, das habe ich auch gemacht…

Verstehe nicht, warum SHOW DATESTLYES immer noch ISO, DMY anzeigt.

Wo könnte das Problem sonst liegen? Stimmt doch schon, dass man datestyle auf der Ebene der Datenbank definieren muss, oder?

“TX nicht commited”: Du hast diesen Befehl in einer Transaktion (TX) abgesetzt, diese Transaktion aber nicht via COMMIT bestätigt.

DATESTYLE kannst Du auf verschiedenen Ebenen setzen: per Session, DB, User, Tranaktion, …

Aber mit

ALTER DATABASE meine_Datenbank SET datestyle TO “ISO, MDY”;

sollte es doch gehen?

Ich versuche jetzt die Daten zuerst als string zu importieren in einen varchar Datentyp und versuche dann type cast zu machen.

Weiss leider nicht mehr, wie ich eine Spalte in VARCHAR (im Format ‘MM/DD/YYYY’) in DATE umwandeln kann.

Kenne to_date Funktion, aber mir ist nicht ganz klar, was ich machen muss, wenn ich alle Werte einer Spalte umwandeln will, statt nur einen Wert…

Oder ist das mit SET datestyle zu lösen?

Der ALTER TABLE Befehl hat eine USING Option:

alter table the_table
     alter the_column type date using to_date(the_column, 'mm/dd/yyyy');
1 „Gefällt mir“

Ah, super, genau das suchte ich. Vielen Dank @castorp !!