sql >> Databáze >  >> RDS >> PostgreSQL

Jak převést pole časového razítka na int8? Nebo prostě sloupec vypustit a vytvořit nový?

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:



  1. Detekce jazyka s daty v PostgreSQL

  2. SQL – záleží na pořadí podmínek NEBO?

  3. Jak profilovat MySQL

  4. Zpomalují nepoužívaná připojení mysql skripty?