PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como converter a hora local para UTC?


Isso é abordado no manual , mas nem sempre é óbvio como trabalhar com datas/horas. A especificação SQL é um pouco bizarra.

No caso da sua pergunta, não está claro se você deseja armazenar a hora em UTC, mas exibi-la na hora local do servidor (TimeZone ), ou se você deseja ignorar TimeZone e sempre exibi-lo como UTC. Eu vou assumir o último.

Para carimbos de data/hora, basta usar AT TIME ZONE duas vezes, como:
SELECT TIMESTAMP '2013-08-13 00:00:00' AT TIME ZONE 'Australia/Sydney' AT TIME ZONE 'UTC';

Você precisa usar AT TIME ZONE duas vezes. Uma vez para converter a entrada timestamp para timestamptz de acordo com o argumento timezone, então outro para converter isso em um timestamp na UTC.

Infelizmente por causa da maneira (IMO insana) que a especificação SQL define AT TIME ZONE por TIME , você não pode fazer a mesma coisa por TIME . Você terá que manipular o TimeZone variável em vez disso:
SET TimeZone = 'UTC';
SELECT TIME '07:00' AT TIME ZONE 'Australia/Sydney';

Isso ainda deixa você com um timetz não é uma time . Portanto, seu valor de exibição muda com o timezone contexto.