2013-08-12 15 views
5

Potrzebuję konwertować czas lokalny na UTC za pomocą funkcji. Wejścia, które mam, to czas lokalny, strefa czasowa czasu lokalnego (np. "Pacyfik/Auckland"). To, czego potrzebuję, aby uzyskać z procedury, to czas UTC dla czasu lokalnego w oparciu o daną strefę czasową.Jak skonwertować czas lokalny na UTC?

Czy ktoś może pomóc?

używam wersji 8.3

+1

http://www.postgresql.org/docs/8.3/static/functions-datetime.html#FUNCTIONS-DATETIME-ZONECONVERT – AdamKG

Odpowiedz

16

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 timetztime. Tak więc jego wartość wyświetlana zmienia się z ustawieniem timezone.

+0

+1 dla zestawu Strefa czasowa, to był fragment, którego mi brakowało do próby konwersji timestamp bez stref czasowych do utc timestampstz. Dzięki! – grinch

Powiązane problemy