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:
- Zeit ignorieren Zonen insgesamt in Rails und PostgreSQL
- Wie erhalte ich das Datum und die Uhrzeit vom Zeitstempel in der PostgreSQL-Auswahlabfrage?
- Wie rundet man den Millisekundenwert von timestamp(0) in PostgreSQL ab?