web-dev-qa-db-fra.com

PostgreSQL alter type timestamp sans fuseau horaire -> avec fuseau horaire

La question est courte: si j'ai déjà des données dans un horodatage de type colonne sans fuseau horaire, si je définis le type sur horodatage avec fuseau horaire, que fait postgresql avec ces données?

54
gyorgyabraham

Il conserve la valeur actuelle en heure locale et définit le fuseau horaire sur le décalage de votre heure locale:

create table a(t timestamp without time zone, t2 timestamp with time zone);
insert into a(t) values ('2012-03-01'::timestamp);
update a set t2 = t;
select * from a;
          t          |           t2           
---------------------+------------------------
 2012-03-01 00:00:00 | 2012-03-01 00:00:00-08

alter table a alter column t type timestamp with time zone;
select * from a;
           t            |           t2           
------------------------+------------------------
 2012-03-01 00:00:00-08 | 2012-03-01 00:00:00-08

Selon le manuel pour Modifier le tablea :

si [la clause USING est] omise, la conversion par défaut est la même qu'une conversion d'affectation de l'ancien type de données vers le nouveau.

Selon le manuel pour types de date/heure

Les conversions entre horodatage sans fuseau horaire et horodatage avec fuseau horaire supposent normalement que la valeur d'horodatage sans fuseau horaire doit être prise ou donnée comme fuseau horaire local temps. Un fuseau horaire différent peut être spécifié pour la conversion à l'aide de AT TIME ZONE.

53
dbenhur

Il est préférable de spécifier explicitement le fuseau horaire. Par exemple, si votre horodatage est censé être UTC (mais sans fuseau horaire), vous devez vous méfier du fait que le fuseau horaire du client ou du serveur peut gâcher tout ici. Écrivez plutôt:

ALTER TABLE a ALTER COLUMN t TYPE TIMESTAMP WITH TIME ZONE USING t AT TIME ZONE 'UTC'
26
Antti Haapala