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:
- Ignorando il tempo zone del tutto in Rails e PostgreSQL
- Come ottenere la data e l'ora dal timestamp nella query di selezione di PostgreSQL?
- Come arrotondare il valore dei millisecondi da timestamp(0) in PostgreSQL?