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.