2010-01-21 4 views
32

В моем веб-приложении хранятся все временные метки в формате UTC без часовых поясов. У меня есть сценарий оболочки/psql, который возвращает список последних логинов, и я хочу, чтобы этот скрипт отображал время входа в локальный часовой пояс сервера (который может варьироваться в зависимости от того, где находится сервер и с летней экономией).Смещение локального часового пояса в PostgreSQL

Чтобы получить интервал, представляющий разницу между часовым поясом моей базы данных сервера и UTC, я в настоящее время с помощью этого хака:

SELECT age(now() at time zone 'UTC', now()); 

Это работает, но есть более простой способ?

Существует параметр конфигурации сервера, называемый «часовой пояс», который возвращает допустимую строку часового пояса, но я не думаю, что можно получить доступ к этим параметрам в запросе. (Я предполагаю, что это отдельный вопрос, но ответ на него будет решить вопрос о часовом поясе.)

+0

Спасибо за вопрос. Я добавил абзац, объясняющий, почему я хочу получить разницу. – TimH

ответ

51
SELECT current_setting('TIMEZONE') 

Это может быть использовано в запросе, однако, это не дает численное значение.

Ваше решение в порядке.

+0

Спасибо, это то, что мне нужно было знать. Это будет работать: SELECT some_table.utc_timestamp в часовом поясе current_setting ('TIMEZONE'); И это намного яснее, чем кто-то читает код, чем мой хак. – TimH

+0

Единственным недостатком этого является то, что он может создавать смещение типа '-05: 00', полное имя часового пояса, например «Австралия/Перт», или даже потенциально двусмысленное сокращение, например «EST». –

+1

@CraigRinger: все, возвращаемое 'CURRENT_SETTING ('timezone')', может быть отправлено на 'AT TIME ZONE' без проблем. – Quassnoi

5

Чтобы получить # разница секунд как целое, я использовал просто:

select extract(timezone from now()); 
Смежные вопросы