1

Temat: UTC do konkretnej strefy

Mam w bazie kolumny z datami typu:
timestamp without time zone jest do nich ładowany czas UTC.

Teraz robię raporty i różne operacje na danych, np. zakres dat, zliczam rekordy w dniu, tygodniu, agregacje itp.

Teraz powiedzmy że mam użytkownika w Polsce i w USA, jak zamienić daty na czas lokalny dla użytkowników w tych krajach z uwzględnieniem zmian czasu (zimowy, letni) (ewentualnie czy w format danych który użyłem jest w tym przypadku odpowiedni)?

2

Odp: UTC do konkretnej strefy

najpierw sprawdź domyślna timezone bazy

show timezone;

Jeśli jest inna niż czas UTC ustaw ją czas UTC poleceniem

set timezone='Etc/Zulu';

poniżej masz selecta pokazującego sposób konwersji

SELECT czas as czas_without_timezone
      ,czas at time zone 'Africa/Juba' as czas_without_bledna_nonwersja
      ,cast (czas as TIMESTAMP WITH TIME ZONE) as czas_biezace_timezone
      ,cast (czas as TIMESTAMP WITH TIME ZONE) AT TIME ZONE 'Africa/Juba' as czas_time_zone_juba_africa
from (select TIMESTAMP WITHout TIME ZONE '2015-02-16 20:38:40' as czas) c;

po czym przywróć zmienną timezone
reset timezone;

najprostszym sposobem konwersji jest przypisanie zmiennej timezone do użytkownika np
ALTER ROLE postgres IN DATABASE test SET TimeZone = 'America/New_York';
wyloguj i zaloguj się do bazy i sprawdź czas select localtimestamp,current_timestamp;

wykaz wszystkich stref czasowych masz tu select * from pg_timezone_names;

pobaw się trochę tymi selectami na 2 różnych użytkownikach z różnymi strefami czasowymi i przekonwertuj pole w którym przechowywałeś czas UTC na timestamp with time zone.