PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come convertire un campo timestamp in int8? O semplicemente rilasciare la colonna e crearne una nuova?

Innanzitutto, l'obiettivo è indefinito senza chiarire cosa sia quel int8 rappresenterà. Secondi dall'epoca? Millisecondi? Microsecondi? (Non importa nel tuo caso particolare con tutti i valori NULL, ma il prossimo lettore potrebbe essere fuorviato.)

Successivamente, in Postgres non è stato definito alcun cast per timestamp --> bigint (praticamente per lo stesso motivo). Hai bisogno di un'espressione valida per USING clausola.

Supponendo che tu voglia i microsecondi poiché ciò preserva la risoluzione originale in microsecondi dei timestamp di Postgres, questo farà il lavoro:

ALTER TABLE public.new_ambient_data
   ALTER COLUMN sensor_date TYPE int8 USING (extract(epoch FROM sensor_date)*1000000)::int8;

In particolare, l'epoca di Postgres per i timestamp inizia al 01-01-2000 00:00:00 UTC, a differenza dell'epoca UNIX che inizia al 01-01-1970 00:00:00 UTC. Ma extract() restituisce l'epoca UNIX (che può essere riconvertita in timestamptz con to_timestamp() ). Quindi non basta convertire il valore interno.

Per il tuo caso particolare (tutti i valori NULL ), è più semplice usare text come trampolino di lancio. Ogni tipo può essere trasmesso da e verso text (purché il valore sia compatibile).

ALTER TABLE public.new_ambient_data
   ALTER COLUMN sensor_date TYPE int8 USING sensor_date::text::int8;

E sì, probabilmente è più economico convertire la colonna in posizione, piuttosto che rilasciarla e ricrearla. Sebbene la colonna sia tutta NULL, l'operazione è molto economica in entrambi i casi, poiché non ci sono dati di tupla effettivi, solo un po' nella bitmap NULL. Nessuno dei due modi attiverà una riscrittura della tabella.

Una colonna appena aggiunta va sempre alla fine dell'elenco delle colonne, mentre quella convertita rimane al suo posto. Dipende da cosa vuoi.

Infine, non farlo affatto. Il tipo di dati timestamp (o timestamptz ) è in genere superiore alla memorizzazione di informazioni temporali come bigint generico in più modi. Vedi i dettagli nella risposta di Laurenz!

Vedi: