Allereerst is het doel niet gedefinieerd zonder duidelijk te maken wat die int8
gaat vertegenwoordigen. Seconden sinds het tijdperk? Milliseconden? Microseconden? (Het maakt in uw specifieke geval niet uit met alle NULL-waarden, maar de volgende lezer kan misleid zijn.)
Vervolgens is er in Postgres geen cast gedefinieerd voor timestamp
--> bigint
(eigenlijk om dezelfde reden). U hebt een geldige uitdrukking nodig voor de USING
clausule.
Ervan uitgaande dat je microseconden wilt omdat dat de oorspronkelijke resolutie van microseconden van Postgres-tijdstempels behoudt, zal dit het werk doen:
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING (extract(epoch FROM sensor_date)*1000000)::int8;
Met name het Postgres-tijdperk voor tijdstempels begint op 01-01-2000 00:00:00 UTC, in tegenstelling tot het UNIX-tijdperk dat begint op 01-01-70 00:00:00 UTC. Maar extract()
geeft het UNIX-tijdperk terug (die terug kan worden geconverteerd naar timestamptz
met to_timestamp()
). Dus alleen de interne waarde converteren is niet voldoende.
Voor uw specifieke geval (alle waarden NULL ), is het eenvoudiger om text
te gebruiken als springplank. Elk type kan worden gecast van en naar text
(zolang de waarde compatibel is).
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING sensor_date::text::int8;
En ja, het is waarschijnlijk goedkoper om de kolom op zijn plaats te converteren dan om hem te laten vallen en opnieuw te maken. Hoewel de kolom helemaal NULL is, is de bewerking hoe dan ook erg goedkoop, omdat er geen echte tuple-gegevens zijn, alleen een beetje in de NULL-bitmap. Geen van beide manieren zal een tabel herschrijven activeren.
Een nieuw toegevoegde kolom gaat altijd naar het einde van de lijst met kolommen, terwijl de geconverteerde kolom op zijn plaats blijft. Hangt ervan af wat je wilt.
Tot slot, niet doen helemaal niet. Het gegevenstype timestamp
(of timestamptz
) is doorgaans superieur aan het opslaan van tijdelijke informatie als generieke bigint
op meerdere manieren. Zie details in het antwoord van Laurenz!
Zie:
- Tijd negeren zones samen in Rails en PostgreSQL
- Hoe haal ik de datum en tijd uit de tijdstempel in de PostgreSQL-selectiequery?
- Hoe de millisecondenwaarde van timestamp(0) in PostgreSQL afronden?