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 :
- Ignorer l'heure zones dans Rails et PostgreSQL
- Comment obtenir la date et l'heure à partir de l'horodatage dans la requête de sélection PostgreSQL ?
- Comment arrondir la valeur des millisecondes à partir de timestamp(0) dans PostgreSQL ?