2016-03-31 12 views
11

Jestem nowym użytkownikiem PostgreSQL i zastanawiałem się, czy istnieje bezpośredni sposób na konwersję wartości znacznika czasu w tabeli na inną strefę czasową za pomocą funkcji. W moim przypadku jest to UTC do EST.Konwertuj strefę czasową UTC w postgresql na EST (czas lokalny)

Są to wartości, na przykład, że trzeba konwertować do EST (nie tylko jedną wartość, ale wszystkie wartości w tabeli)

date 
------------------- 
2015-10-24 16:38:46 
2016-01-19 18:27:00 
2016-01-24 16:14:34 
2016-02-09 23:05:49 
2016-02-11 20:46:26 
+0

strony Informacja: prawdopodobnie chcesz użyć ' 'America/New_York'' (z bazy danych strefy czasowej [IANA] (https://en.wikipedia.org/wiki/ Tz_database)) jako swoją strefę czasową, a nie "EST''. Trzyliterowe skróty są nieprecyzyjne (czy naprawdę masz na myśli UTC-0400, czy też chcesz UTC-0300 w lecie?) I często powtarzają się w wielu krajach, a nawet w jednym kraju (strefy czasowe zarówno na Alasce, jak i na Portoryko są często oba oznaczone jako "AST") –

Odpowiedz

20

tu w Londynie, jesteśmy obecnie 1 godziny przed UTC. Więc - jeśli wezmę strefę czasową bez sygnatury czasowej i powiem, że jest w UTC, wydrukuję ją dla mojej lokalnej strefy czasowej.

richardh=> SELECT ((timestamp '2015-10-24 16:38:46') AT TIME ZONE 'UTC'); 
     timezone   
------------------------ 
2015-10-24 17:38:46+01 
(1 row) 

Ale chcesz "EST", który wydaje się być gdzieś w obu Amerykach, sądząc po zwróconej wartości. Jeśli chcesz, możesz zawrzeć wyrażenie w małej funkcji SQL.

richardh=> SELECT ((timestamp '2015-10-24 16:38:46') AT TIME ZONE 'UTC') AT TIME ZONE 'EST'; 
     timezone  
--------------------- 
2015-10-24 11:38:46 
(1 row) 

Edycja: jak to zrobić w zapytaniu

SELECT ((stored_timestamp AT TIME ZONE 'UTC') AT TIME ZONE 'EST') AS local_timestamp 
FROM my_table; 

Prawdopodobnie będzie chciał dostać książkę wprowadzającą na SQL, jeśli coś takiego jest przyczyną Ci problemów.

+0

Dziękuję bardzo. Ale ta funkcja służy tylko do niestandardowej wartości znacznika czasu, prawda? Jak to zrobić, jeśli muszę zmienić wszystkie wiersze w tabeli, ale nie tylko wartość? –

3

Podobnie wykonać

SELECT '2015-10-24 16:38:46'::timestamp AT time zone 'EST'; 

timezone 
------------------------ 
2015-10-24 21:38:46+00 
(1 row) 
+0

Czy to wymaga, aby baza danych była ustawiona domyślnie na UTC? – benjimin

+0

benjimin Tak. Ponieważ gdy Postgres uruchomi to polecenie, skonwertuje wartość znacznika czasu na EST, ale następnie wyświetli w ustawionej strefie czasowej. Podobny do pierwszej części odpowiedzi @Richarda Huxtona. Konwertują sygnaturę czasową na "UTC", ale są wyświetlane jako +01. –

Powiązane problemy