To jest pokryta w manual, ale nie zawsze jest to oczywiste, jak faktycznie działa z daty/czasu. Specyfikacja SQL jest nieco dziwna.
W przypadku pytania nie jest jasne, czy chcesz przechowywać czas w UTC, ale wyświetlać go w czasie lokalnym serwera (TimeZone
), czy też ignorować TimeZone
i zawsze wyświetlać jako UTC. Założę to drugie.
Dla znaczników czasu, że po prostu użyć AT TIME ZONE
dwa razy, jak:
SELECT TIMESTAMP '2013-08-13 00:00:00' AT TIME ZONE 'Australia/Sydney' AT TIME ZONE 'UTC';
Trzeba użyć AT TIME ZONE
dwukrotnie. Raz, aby przekonwertować dane wejściowe timestamp
na timestamptz
zgodnie ze strefą czasową argumentu, a następnie na innym, aby przekonwertować to na timestamp
w UTC.
Niestety ze względu na sposób (IMO szalony) specyfikacja SQL definiuje AT TIME ZONE
dla TIME
, nie można zrobić tego samego dla TIME
. Będziesz musiał manipulować zmienną TimeZone
zamiast:
SET TimeZone = 'UTC';
SELECT TIME '07:00' AT TIME ZONE 'Australia/Sydney';
to nadal pozostawia Ci nie timetz
time
. Tak więc jego wartość wyświetlana zmienia się z ustawieniem timezone
.
http://www.postgresql.org/docs/8.3/static/functions-datetime.html#FUNCTIONS-DATETIME-ZONECONVERT – AdamKG