En primer lugar, el objetivo es indefinido sin aclarar lo que int8
va a representar. ¿Segundos desde la época? ¿Milisegundos? ¿Microsegundos? (No importará en su caso particular con todos los valores NULOS, pero el próximo lector podría estar equivocado).
A continuación, en Postgres no hay una conversión definida para timestamp
--> bigint
(básicamente por la misma razón). Necesita una expresión válida para USING
cláusula.
Suponiendo que desea microsegundos porque eso está preservando la resolución original de microsegundos de las marcas de tiempo de Postgres, esto hará el trabajo:
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING (extract(epoch FROM sensor_date)*1000000)::int8;
En particular, la época de Postgres para las marcas de tiempo comienza en 2000-01-01 00:00:00 UTC, a diferencia de la época de UNIX que comienza en 1970-01-01 00:00:00 UTC. Pero extract()
devuelve la época de UNIX (que se puede volver a convertir a timestamptz
con to_timestamp()
). Así que simplemente convertir el valor interno no funcionaría.
Para su caso particular (todos los valores NULL ), es más sencillo usar text
como peldaño. Cada tipo se puede convertir desde y hacia text
(siempre y cuando el valor sea compatible).
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING sensor_date::text::int8;
Y sí, probablemente sea más barato convertir la columna en su lugar que dejarla caer y recrearla. Si bien la columna es NULL, la operación es muy económica de cualquier manera, ya que no hay datos de tupla reales, solo un poco en el mapa de bits NULL. De ninguna manera se activará una reescritura de la tabla.
Una columna recién agregada siempre va al final de la lista de columnas, mientras que la convertida permanece en su lugar. Depende de lo que quieras.
Finalmente, no lo hagas en absoluto. El tipo de datos timestamp
(o timestamptz
) suele ser superior a almacenar información temporal como bigint
genérico de múltiples maneras. ¡Vea los detalles en la respuesta de Laurenz!
Ver:
- Ignorar el tiempo zonas por completo en Rails y PostgreSQL
- ¿Cómo obtener la fecha y la hora de la marca de tiempo en la consulta de selección de PostgreSQL?
- ¿Cómo redondear el valor en milisegundos de la marca de tiempo (0) en PostgreSQL?