sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo convertir un campo de marca de tiempo a int8? ¿O simplemente soltar la columna y hacer una nueva?

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: