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.