Probleme mit Datumswert bei COPY- Befehl

Hallo,

ich möchte mit COPY Daten aus einer csv-Datei mit 164135 Zeilen in meine DB importieren. Nach 5760 erfolgreichen Datensatzeinträgen kommt jedoch folgende Fehlermeldung:

ERROR: date/time field value out of range: "13.01.1995"
SQL Status:22008
Hinweis:Perhaps you need a different "datestyle" setting.
Kontext:COPY messwerte, line 5761, column datum: "13.01.1995"

bisher hat das Datum bei solch einem Import kein Problem dargestellt.
Ich habe auch schon die csv-Datei an der Stelle im Texteditor angeschaut, der Eintrag unterscheidet sich nicht von den Vorherigen.

Kann mir da jemand weiterhelfen?

Grüße, Marion.

PS: SQL-Status 22008 --> DATETIME FIELD OVERFLOW, damit kann ich nicht wirklich viel anfangen, normalerweise helfen diese Nummern weiter bei Fehlermeldungen, aber was bedeutet in diesem Fall “overflow”? In den Zeilen zuvor hat’s doch auch funktioniert…

Hallo,

dein Datumsformat stimmt nicht. Probier mal Hochkomma um den Datumswert zu setzen. ansonsten änder das Datumsformat nach YYYY-MM-TT…
aber selbst dann brauchst du glaub ich Hochkomma: also ‘YYYY-MM-TT’

sry für das Halbwissen, aber ich habs nich mehr genau parat.
Grüße
beho

Hallo Marion,

Da Du schon andere Daten importiert hast, funktioniert ja der Befehl. Schau Dir die Zeile 5761, eventuell auch die vorherigen Zeile, genau an. Vermutlich ist dort ein Zeichen, welches dort nicht hingehört. Auch genau hinschauen, was direkt nach dem Datumsfeld steht. Hilfreich ist in solchen Fällen immer, wenn man sich das im binären Format anschaut.



mfg

fristo

PG vermutet ohne weitere Infos erst einmal amerikanisches Datumsformat. Und auch wenn man denen viel Blödsinn nachreden kann: einen 13. Monat haben auch die nicht.
Du solltest den Hint: also beachten:

test=*# select '13.01.1995'::date;
ERROR:  date/time field value out of range: "13.01.1995"
HINT:  Perhaps you need a different "datestyle" setting.
test=*# rollback;
ROLLBACK
test=# set datestyle=german;
SET
Time: 0.500 ms
test=*# select '13.01.1995'::date;
    date
------------
 13.01.1995
(1 row)

Andreas

VIELEN DANK !

SET datestyle TO postgres, dmy;

war die Lösung, ich hatte tatsächlich noch keine Datumswerte über einen 12. Tag im Monat hinaus eingelesen…
sowas kleines und es kann einem gewaltig an die Nerven gehen :wink:

Tja, Größe spielt nicht immer eine Rolle :wink:

Sei froh, daß PG so pingelig ist. Es gibt andere Möchtegern-DB-Systeme, die machen beim Massen-COPY alle Nase lang von selbst ein COMMIT. Du hättest dann einen Batzen von Datensätzen mit offensichtlich falsch interpretierten Datum.


Andreas

Jepp, da ist was dran. Offensichtlich hattest du 5760 falsch importierte Daten vorliegen … wäre das Problem später bei einer Kontrolle aufgefallen?

Mit Sicherheit wäre das noch ein Problem geworden, wenn dann nämlich die Daten mit der programmierten Anwendung (es geht um das Auslesen von Klimadaten) ausgegeben werden, dann wäre ja ein 03.04.1995 anstatt ein 04.03.1995 rausgekommen, was bei Klimadaten natürlich fatal ist, wenn einem Tag das “falsche” Wetter zugeordnet ist… ausserdem wären wahrscheinlich Daten an Tagen zu finden gewesen, die zur angegeben Jahreszeit untypisch sind, aber spätestens beim 03.15.1995 wäre ich/man dann endgültig skeptisch geworden, nur dann wären halt schon ein haufen Daten importiert gewesen…

Zum Glück ist PostgreSQL so pingelig :slight_smile:

ich danke euch nochmal und Grüße!