Za prvé, cíl není definován, aniž by bylo jasné, co to je int8
bude reprezentovat. Vteřiny od epochy? Milisekundy? Mikrosekundy? (Ve vašem konkrétním případě nezáleží na všech hodnotách NULL, ale další čtenář může být zavádějící.)
Dále, v Postgresu není definováno žádné obsazení pro timestamp
--> bigint
(v podstatě ze stejného důvodu). Pro USING
potřebujete platný výraz doložka.
Za předpokladu, že chcete mikrosekundy protože to zachovává původní mikrosekundové rozlišení časových razítek Postgres, bude to fungovat:
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING (extract(epoch FROM sensor_date)*1000000)::int8;
Zejména epocha Postgres pro časová razítka začíná v 2000-01-01 00:00:00 UTC, na rozdíl od epochy UNIX začínající v 1970-01-01 00:00:00 UTC. Ale extract()
vrátí epochu UNIX (kterou lze převést zpět na timestamptz
s to_timestamp()
). Takže pouhý převod interní hodnoty by nepomohl.
Pro váš konkrétní případ (všechny hodnoty NULL ), je jednodušší použít text
jako odrazový můstek. Každý typ lze přetypovat z a do text
(pokud je hodnota kompatibilní).
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING sensor_date::text::int8;
A ano, je pravděpodobně levnější sloupec převést na místo, než jej vypustit a znovu vytvořit. I když je celý sloupec NULL, operace je v obou směrech velmi levná, protože neexistují žádná skutečná data n-tice, pouze bit v bitmapě NULL. Ani jeden způsob nespustí přepis tabulky.
Nově přidaný sloupec se vždy přesune na konec seznamu sloupců, zatímco převedený zůstane na svém místě. Záleží na tom, co chcete.
Nakonec nedělejte to vůbec. Datový typ timestamp
(nebo timestamptz
) je obvykle lepší než ukládání časové informace jako generický bigint
více způsoby. Podrobnosti naleznete v Laurenzově odpovědi!
Viz:
- Ignorování času zóny dohromady v Rails a PostgreSQL
- Jak získat datum a čas z časového razítka ve výběrovém dotazu PostgreSQL?
- Jak zaokrouhlit hodnotu v milisekundách od časového razítka(0) v PostgreSQL?