postgresql: как преобразовать временную метку UTC в время Сиднея

#postgresql #timezone #timestamp #utc

#postgresql #Часовой пояс #временная метка #utc

Вопрос:

У меня есть база данных PostgreSQL со многими таблицами, в которых хранятся временные метки по местному времени Сиднея / Австралии. Кроме того, у меня есть одна таблица, в которой хранятся временные метки в UTC. Это нельзя изменить.

Мой вопрос — какие манипуляции с SQL мне нужно использовать, чтобы получить временные метки UTC по местному времени Сиднея / Австралии?

Я осознаю тот факт, что в Сиднее есть периоды перехода на летнее время, и я не уверен, как написать свой SQL, чтобы преобразование всегда было правильным — независимо от того, была ли временная метка взята во время перехода на летнее время или нет.

Пожалуйста, сообщите.

Спасибо, Амит

Ответ №1:

используйте at time zone , как:

 t=# select now() at time zone 'AEDT';
-[ RECORD 1 ]------------------------
timezone | 2016-10-11 08:20:39.067256

Time: 2.439 ms
  

например, существует устаревший список часовых
поясов или просто используйте pg_timezone_names :

 t=# select * from pg_timezone_names()  where name ilike '%sydney%';
-[ RECORD 1 ]----------------------
name       | posix/Australia/Sydney
abbrev     | AEDT
utc_offset | 11:00:00
is_dst     | t
-[ RECORD 2 ]----------------------
name       | Australia/Sydney
abbrev     | AEDT
utc_offset | 11:00:00
is_dst     | t

Time: 171.649 ms
  

Комментарии:

1. Итак, предполагая, что у меня есть 2 следующие записи:

2. если у вас есть версия до версии 9.0 (которая есть pg_timezone_names ), используйте веб-ссылку выше