Konvertieren Sie Postgres TIMESTAMP in TIMESTAMPTZ

8

Ich habe eine Zeitreihendatenbank mit angemessener Größe (~ 50.000 Zeilen), die auf Postgres ausgeführt wird, mit einigen anderen strukturierten Daten (in einer anderen Datenbankinstanz), die viel kleiner sind.

Dummerweise, als ich das Ding ursprünglich entworfen habe, hatte ich alle Felder als TIMESTAMP WITHOUT TIME ZONE, und jetzt bezahle ich es mit nervigen zeitzonenbezogenen Fehlern. Ich möchte, dass alles explizit ist, also möchte ich das Feld in konvertieren TIMESTAMP WITH TIME ZONE. Mir ist klar, dass hier keine zusätzlichen Informationen gespeichert werden und alle meine Zeitstempel bereits in UTC gespeichert sind. Daher sollte die Migration trivial sein, aber ich habe mich gefragt, ob es Komplikationen / mögliche Auslöseblöcke gibt, die sich als problematisch erweisen (dies ist eine Produktion) Datenbank mit Kunden, die sich darauf verlassen)?

GTF
quelle

Antworten:

13

Achten Sie darauf, dass während der Konvertierung die richtige Zeitzone (in Ihrem Fall UTC) angewendet wird. Wenn dies nicht explizit angegeben ist, wird die Zeitzone der aktuellen Sitzung angenommen - normalerweise nicht UTC.

ALTER TABLE tbl ALTER ts_column TYPE timestamptz USING ts_column AT TIME ZONE 'UTC';

Überprüfen Sie auch einen möglichen Spaltenstandard auf Vernunft. Jeder Ausdruck, der mit dem Datentyp timestamp(wie LOCALTIMESTAMPoder now()::timestamp) arbeitet, unterliegt demselben Problem. Wechseln:

ALTER TABLE tbl ALTER ts_column SET DEFAULT now(); -- or current_timestamp

Natürlich müssen timestamptzjetzt auch Anweisungen, die in die Tabelle schreiben, verwendet werden - oder Sie haben eine andere Instanz desselben Problems mit der automatischen Konvertierung vom Typ timestamp [without time zone].

Da es sich um eine Produktions-DB handelt, tun Sie dies am besten in einer einzigen Transaktion, um Rennbedingungen zu vermeiden - oder sogar in einer einzigen Aussage:

ALTER TABLE tbl
  ALTER ts_column TYPE timestamptz USING ts_column AT TIME ZONE 'UTC'
, ALTER ts_column SET DEFAULT now();

Grundlagen:

Erwin Brandstetter
quelle