Em primeiro lugar, o objetivo é indefinido sem esclarecer o que esse
int8
vai representar. Segundos desde a época? Milissegundos? Microssegundos? (Não importa no seu caso particular com todos os valores NULL, mas o próximo leitor pode estar equivocado.) Em seguida, no Postgres não há cast definido para
timestamp
--> bigint
(basicamente pelo mesmo motivo). Você precisa de uma expressão válida para o USING
cláusula. Supondo que você queira microssegundos como isso está preservando a resolução original de microssegundos dos carimbos de data e hora do Postgres, isso fará o trabalho:
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING (extract(epoch FROM sensor_date)*1000000)::int8;
Notavelmente, a época do Postgres para carimbos de data/hora começa em 2000-01-01 00:00:00 UTC, ao contrário da época do UNIX que começa em 1970-01-01 00:00:00 UTC. Mas
extract()
retorna a época do UNIX (que pode ser convertida de volta para timestamptz
com to_timestamp()
). Portanto, apenas converter o valor interno não funcionaria. Para seu caso específico (todos os valores NULL ), é mais simples usar
text
como trampolim. Cada tipo pode ser convertido de e para text
(desde que o valor seja compatível). ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING sensor_date::text::int8;
E sim, provavelmente é mais barato converter a coluna no lugar do que soltá-la e recriá-la. Embora a coluna seja toda NULL, a operação é muito barata de qualquer maneira, pois não há dados de tupla reais, apenas um bit no bitmap NULL. Nenhuma das formas acionará uma reescrita de tabela.
Uma coluna recém-adicionada sempre vai para o final da lista de colunas, enquanto a convertida permanece no lugar. Depende do que você quer.
Por fim, não faça isso de forma alguma. O tipo de dados
timestamp
(ou timestamptz
) é normalmente superior ao armazenamento de informações temporais como bigint
genérico de várias maneiras. Veja detalhes na resposta de Laurenz! Ver:
- Ignorando o tempo zones completamente em Rails e PostgreSQL
- Como obter a data e hora do carimbo de data/hora na consulta de seleção do PostgreSQL?
- Como arredondar o valor de milissegundos do timestamp(0) no PostgreSQL?