Przede wszystkim cel jest niezdefiniowany bez wyjaśnienia, co to int8
będzie reprezentować. Sekundy od epoki? Milisekundy? Mikrosekundy? (Nie ma to znaczenia w twoim konkretnym przypadku ze wszystkimi wartościami NULL, ale następny czytelnik może się mylić.)
Następnie w Postgresie nie ma zdefiniowanego rzutowania dla timestamp
--> bigint
(w zasadzie z tego samego powodu). Potrzebujesz prawidłowego wyrażenia dla USING
klauzula.
Zakładając, że potrzebujesz mikrosekund ponieważ zachowuje to oryginalną mikrosekundową rozdzielczość znaczników czasu Postgres, to wykona zadanie:
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING (extract(epoch FROM sensor_date)*1000000)::int8;
Warto zauważyć, że epoka Postgres dla znaczników czasu zaczyna się od 2000-01-01 00:00:00 UTC, w przeciwieństwie do epoki UNIX, która zaczyna się od 1970-01-01 00:00:00 UTC. Ale extract()
zwraca epokę UNIX (którą można przekonwertować z powrotem na timestamptz
z to_timestamp()
). Więc sama konwersja wartości wewnętrznej nie wystarczy.
W konkretnym przypadku (wszystkie wartości NULL ), łatwiej jest użyć text
jako odskocznię. Każdy typ może być rzutowany z i do text
(o ile wartość jest zgodna).
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING sensor_date::text::int8;
I tak, prawdopodobnie taniej jest przekonwertować kolumnę w miejscu, niż upuścić i odtworzyć ją. Chociaż cała kolumna ma wartość NULL, operacja jest bardzo tania, ponieważ nie ma rzeczywistych danych krotki, tylko bit w bitmapie NULL. Żaden sposób nie spowoduje przepisania tabeli.
Nowo dodana kolumna zawsze trafia na koniec listy kolumn, podczas gdy przekonwertowana pozostaje na swoim miejscu. Zależy od tego, czego chcesz.
Wreszcie nie rób tego w ogóle. Typ danych timestamp
(lub timestamp
) jest zazwyczaj lepsze od przechowywania informacji tymczasowych jako ogólnych bigint
na wiele sposobów. Zobacz szczegóły w odpowiedzi Laurenza!
Zobacz:
- Ignorowanie czasu strefy łącznie w Railsach i PostgreSQL
- Jak uzyskać datę i godzinę ze znacznika czasu w zapytaniu wybierającym PostgreSQL?
- Jak zaokrąglić wartość milisekund ze znacznika czasu(0) w PostgreSQL?