Først og fremmest er målet udefineret uden at opklare, hvad det int8
kommer til at repræsentere. Sekunder siden epoken? Millisekunder? Mikrosekunder? (Vil ikke betyde noget i dit særlige tilfælde med alle NULL-værdier, men den næste læser kan være forkert.)
Dernæst i Postgres er der ingen cast defineret for timestamp
--> bigint
(grundlæggende af samme grund). Du skal bruge et gyldigt udtryk for USING
klausul.
Forudsat at du vil have mikrosekunder fordi det bevarer den originale mikrosekundsopløsning af Postgres tidsstempler, vil dette gøre jobbet:
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING (extract(epoch FROM sensor_date)*1000000)::int8;
Det er bemærkelsesværdigt, at Postgres-epoken for tidsstempler starter ved 2000-01-01 00:00:00 UTC, i modsætning til UNIX-epoken, der starter ved 1970-01-01 00:00:00 UTC. Men extract()
returnerer UNIX-epoken (som kan konverteres tilbage til timestamptz
med to_timestamp()
). Så bare at konvertere den interne værdi ville ikke betale sig.
Til dit særlige tilfælde (alle værdier NULL ), er det nemmere at bruge text
som trædesten. Hver type kan castes fra og til text
(så længe værdien er kompatibel).
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING sensor_date::text::int8;
Og ja, det er nok billigere at konvertere søjlen på plads, end at droppe og genskabe den. Mens kolonnen er NULL, er operationen meget billig på begge måder, da der ikke er nogen egentlige tuple-data, kun en smule i NULL-bitmap. Ingen af måderne vil udløse en tabelomskrivning.
En ny tilføjet kolonne går altid til slutningen af kolonnelisten, mens den konverterede forbliver på plads. Afhænger af, hvad du ønsker.
Endelig gør det ikke overhovedet. Datatypen timestamp
(eller timestamptz
) er typisk bedre end lagring af tidsmæssig information som generisk bigint
på flere måder. Se detaljer i Laurenz' svar!
Se:
- Ignorerer tid zoner helt i Rails og PostgreSQL
- Hvordan får man datoen og klokkeslættet fra tidsstemplet i PostgreSQL-valgforespørgslen?
- Hvordan afrundes millisekunderværdi fra tidsstempel(0) i PostgreSQL?