PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como converter um campo de carimbo de data/hora para int8? Ou simplesmente largar a coluna e fazer uma nova?


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: