No Postgres 9.5, faço o seguinte para converter a timestamptz
para o fuso horário UTC:
SELECT TIMESTAMP WITH TIME ZONE '2016-02-20 15:15:54.000495+01' AT TIME ZONE 'UTC'
isso gera corretamente 2016-02-20 14:15:54.000495
como timestamp without timezone
.
Eu gostaria de armazenar esse valor em uma timestamptz
coluna. No entanto, quando eu faço o seguinte:
SELECT (TIMESTAMP WITH TIME ZONE '2016-02-20 15:15:54.000495+01' AT TIME ZONE 'UTC')::timestamptz
Eu esperaria obter 2016-02-20 14:15:54.000495
como timestamptz
.
No entanto, esta consulta me dá 2016-02-20 14:15:54.000495+01
como timestamptz
, que infelizmente nem representa a hora original.
Qual é a razão de tal comportamento? Como faço isso funcionar corretamente?
Uma conversão simples de
timestamp
paratimestamptz
assume seu fuso horário atual. Se você deseja que o elenco assuma UTC (ou qualquer outro fuso horário), você deve usar aAT TIME ZONE
construção novamente:Você pode estar perdendo que
AT TIME ZONE
tem dois casos de uso diferentes. Pode transportimestamptz
paratimestamp
e vice-versa. Resposta relacionada com explicação detalhada:Esteja ciente de que sua declaração não faz sentido:
A representação de texto de
timestamptz
é sempre exibida como hora local de acordo com sua configuração de fuso horário atual, estendida com um deslocamento para UTC. O literal que você exibe não tem deslocamento, portanto é umtimestamp
literal, nãotimestamptz
. Básico aqui: