Jest to opisane w podręczniku , ale nie zawsze jest oczywiste, jak właściwie pracować z datami/godzinami. Specyfikacja SQL jest nieco dziwna.
W przypadku Twojego pytania nie jest jasne, czy chcesz przechowywać czas w UTC, ale wyświetlać go w czasie lokalnym serwera (TimeZone
) lub czy chcesz zignorować TimeZone
i zawsze wyświetlaj go jako UTC. Zakładam to drugie.
W przypadku znaczników czasu użyj po prostu AT TIME ZONE
dwa razy, np.:
SELECT TIMESTAMP '2013-08-13 00:00:00' AT TIME ZONE 'Australia/Sydney' AT TIME ZONE 'UTC';
Musisz użyć AT TIME ZONE
dwa razy. Raz, aby przekonwertować wejściowy timestamp
do timestamptz
zgodnie z argumentem strefa czasowa, a następnie inny, aby przekonwertować to na timestamp
w UTC.
Niestety ze względu na (szalony IMO) sposób, w jaki specyfikacja SQL definiuje AT TIME ZONE
na TIME
, nie możesz zrobić tego samego przez TIME
. Będziesz musiał manipulować TimeZone
zamiast tego zmienna:
SET TimeZone = 'UTC';
SELECT TIME '07:00' AT TIME ZONE 'Australia/Sydney';
To nadal daje ci timetz
nie time
. Tak więc jego wyświetlana wartość zmienia się wraz ze TimeZone
ustawienie.