2014-01-22 4 views
0

Итак, я храню время, соответствующее часовому поясу, скажем, 12 полдень в Москве, как 2014-01-22 12:00:00+04. Я хочу вернуть это, но если я просто позвоню select my_timestamp from my_table, он вернет 2014-01-22 08:00:00+00. У меня есть столбец timezone с именем olson в часовом поясе (в данном случае europe/moscow), есть ли способ, которым я могу построить выбор, который возвращает мне точный объект, который я вводил с сохранением его часового пояса, в отличие от его преобразования в локальное время моего сервера (ВРЕМЯ ПО ГРИНВИЧУ)? Я просмотрел документы postgres, которые упоминают функцию at time zone, но не успели получить ее, чтобы сохранить информацию о часовом поясе при возврате.выберите временную метку tz со своим локальным смещением utc

+0

Erwin Brandstetter дал отличный ответ, который вам может пригодиться: http://stackoverflow.com/a/9576170 – bma

+0

Спасибо, bma, это довольно полная разбивка. Позор, я думаю, мне придется хранить время как наивное и в совокупности с моим часовым поясом в коде моего приложения. – bbm

ответ

1

Нет, нет никакого способа сделать это. PostgreSQL не сохраняет смещение клиента, который вставляет или обновляет значение.

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

Использование синтаксиса AT TIME ZONE вместе с правильным часовым поясом должно дать вам правильное значение временной метки, но оно не будет включать смещение клиента, который первоначально вставил или обновил метку времени.

+0

в качестве примечания, является ли совет разработчика не ссылкой конкретно на «время» без компонента даты? Я использую 'timestamp с часовым поясом'. – bbm

+0

@bbm: Да, спасибо, что указали это. Я не знаю, о чем я думал. –

0

Смотрите, если это поможет в любом случае:

SELECT now(), now()::timestamp, now() AT TIME ZONE 'europe/moscow', now()::timestamp AT TIME ZONE 'europe/moscow' 

Вы можете конвертировать между часовыми поясами. Не дает вам часовой пояс + 04, но дает вам время в этот часовой пояс.

Смежные вопросы