Först och främst är målet odefinierat utan att klargöra vad som int8
kommer att representera. Sekunder sedan epoken? Millisekunder? Mikrosekunder? (Kommer inte att spela någon roll i ditt specifika fall med alla NULL-värden, men nästa läsare kan bli missriktad.)
Därefter, i Postgres finns det ingen cast definierad för timestamp
--> bigint
(i princip av samma anledning). Du behöver ett giltigt uttryck för USING
klausul.
Förutsatt att du vill ha mikrosekunder eftersom det bevarar den ursprungliga mikrosekundupplösningen för Postgres tidsstämplar, kommer detta att göra jobbet:
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING (extract(epoch FROM sensor_date)*1000000)::int8;
Noterbart är att Postgres-epoken för tidsstämplar börjar 2000-01-01 00:00:00 UTC, till skillnad från UNIX-epoken som börjar 1970-01-01 00:00:00 UTC. Men extract()
returnerar UNIX-epoken (som kan konverteras tillbaka till timestamptz
med to_timestamp()
). Så att bara konvertera det interna värdet skulle inte fungera.
För ditt specifika fall (alla värden NULL ), är det enklare att använda text
som språngbräda. Varje typ kan casta från och till text
(så länge värdet är kompatibelt).
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING sensor_date::text::int8;
Och ja, det är förmodligen billigare att konvertera kolumnen på plats, än att släppa och återskapa den. Medan kolumnen är NULL, är operationen mycket billig i båda riktningarna, eftersom det inte finns några faktiska tupeldata, bara en bit i NULL-bitmappen. Inget av sätten kommer att utlösa en tabellomskrivning.
En nyligen tillagd kolumn går alltid till slutet av kolumnlistan, medan den konverterade stannar på plats. Beror på vad du vill ha.
Slutligen, gör inte det alls. Datatypen timestamp
(eller timestamptz
) är vanligtvis överlägsen att lagra tidsinformation som generisk bigint
på flera sätt. Se detaljer i Laurenz svar!
Se:
- Ignorerar tid zoner helt och hållet i Rails och PostgreSQL
- Hur får man datum och tid från tidsstämpeln i PostgreSQL-valfrågan?
- Hur avrundar man värdet på millisekunder från tidsstämpel(0) i PostgreSQL?