PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment convertir un champ d'horodatage en int8 ? Ou simplement supprimer la colonne et en créer une nouvelle ?

Tout d'abord, l'objectif est indéfini sans clarifier ce que int8 va représenter. Secondes depuis l'époque? millisecondes ? Microsecondes ? (Peu importe dans votre cas particulier avec toutes les valeurs NULL, mais le prochain lecteur pourrait se tromper.)

Ensuite, dans Postgres, aucun cast n'est défini pour timestamp --> bigint (essentiellement pour la même raison). Vous avez besoin d'une expression valide pour le USING clause.

En supposant que vous vouliez des microsecondes parce que cela préserve la résolution originale en microsecondes des horodatages Postgres, cela fera l'affaire :

ALTER TABLE public.new_ambient_data
   ALTER COLUMN sensor_date TYPE int8 USING (extract(epoch FROM sensor_date)*1000000)::int8;

Notamment, l'époque Postgres pour les horodatages commence à 2000-01-01 00:00:00 UTC, contrairement à l'époque UNIX commençant à 1970-01-01 00:00:00 UTC. Mais extract() renvoie l'époque UNIX (qui peut être reconvertie en timestamptz avec to_timestamp() ). Il ne suffit donc pas de convertir la valeur interne.

Pour votre cas particulier (toutes les valeurs NULL ), il est plus simple d'utiliser text comme tremplin. Chaque type peut être transtypé depuis et vers text (tant que la valeur est compatible).

ALTER TABLE public.new_ambient_data
   ALTER COLUMN sensor_date TYPE int8 USING sensor_date::text::int8;

Et oui, il est probablement moins cher de convertir la colonne sur place que de la supprimer et de la recréer. Bien que la colonne soit entièrement NULL, l'opération est très bon marché dans les deux cas, car il n'y a pas de données de tuple réelles, seulement un peu dans le bitmap NULL. Aucune des deux manières ne déclenchera une réécriture de table.

Une colonne nouvellement ajoutée va toujours à la fin de la liste des colonnes, tandis que la colonne convertie reste en place. Cela dépend de ce que vous voulez.

Enfin, ne le faites pas du tout. Le type de données timestamp (ou timestamptz ) est généralement supérieur au stockage des informations temporelles en tant que bigint générique de multiples manières. Voir les détails dans la réponse de Laurenz !

Voir :