PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie konvertiere ich ein Zeitstempelfeld in int8? Oder einfach die Spalte löschen und eine neue erstellen?

Zunächst einmal ist das Ziel undefiniert, ohne zu klären, was dieser int8 ist wird vertreten. Sekunden seit der Epoche? Millisekunden? Mikrosekunden? (Wird in Ihrem speziellen Fall mit allen NULL-Werten keine Rolle spielen, aber der nächste Leser könnte fehlgeleitet werden.)

Als nächstes ist in Postgres kein Cast für timestamp definiert --> bigint (im Grunde aus dem gleichen Grund). Für USING benötigen Sie einen gültigen Ausdruck Klausel.

Angenommen, Sie wollen Mikrosekunden Da dies die ursprüngliche Mikrosekundenauflösung von Postgres-Zeitstempeln beibehält, wird dies die Aufgabe erledigen:

ALTER TABLE public.new_ambient_data
   ALTER COLUMN sensor_date TYPE int8 USING (extract(epoch FROM sensor_date)*1000000)::int8;

Insbesondere beginnt die Postgres-Epoche für Zeitstempel am 01.01.2000 00:00:00 UTC, im Gegensatz zur UNIX-Epoche, die am 01.01.1970 00:00:00 UTC beginnt. Aber extract() gibt die UNIX-Epoche zurück (die zurück in timestamptz konvertiert werden kann mit to_timestamp() ). Es würde also nicht reichen, einfach den internen Wert umzuwandeln.

Für Ihren speziellen Fall (alle Werte NULL ), ist es einfacher, text zu verwenden als Sprungbrett. Jeder Typ kann von und nach text gecastet werden (solange der Wert kompatibel ist).

ALTER TABLE public.new_ambient_data
   ALTER COLUMN sensor_date TYPE int8 USING sensor_date::text::int8;

Und ja, es ist wahrscheinlich billiger, die Spalte an Ort und Stelle zu konvertieren, als sie zu löschen und neu zu erstellen. Während die Spalte alle NULL ist, ist die Operation so oder so sehr billig, da es keine tatsächlichen Tupeldaten gibt, nur ein bisschen in der NULL-Bitmap. Auf keinen Fall wird eine Tabellenumschreibung ausgelöst.

Eine neu hinzugefügte Spalte wird immer an das Ende der Spaltenliste verschoben, während die konvertierte an Ort und Stelle bleibt. Hängt davon ab, was Sie wollen.

Schließlich tun Sie es nicht überhaupt. Der Datentyp timestamp (oder timestamptz ) ist typischerweise besser als das Speichern zeitlicher Informationen als generisches bigint in mehrfacher Hinsicht. Siehe Details in Laurenz' Antwort!

Siehe: