2012-04-30 2 views
5

Мы размещаем наши собственные датчики потока (это похоже на этот калибр USGS: http://waterdata.usgs.gov/usa/nwis/uv?site_no=03539600), поэтому мы, байдарки, знаем, достаточно ли воды для заливки потока и не тратить время и газ, чтобы проехать там. Мы надеемся установить несколько из них в юго-восточной части whitewater, которая охватывает восточные и центральные часовые пояса.Часовой пояс со временем перехода на летнее время в PostgreSQL

Я сохраняю время, когда запись вставляется с использованием значения по умолчанию current_time для записи. Я хотел бы позже отобразить данные, используя формат MM/DD/YYYY HH12:MI AM TZ, который выводит значения, такие как 03/12/2012 01:00 AM CDT. Я также хотел бы, чтобы на выходе были заметны изменения в дневном свете, поэтому последняя часть предыдущего предложения изменилась бы между CST и CDT, когда мы «продвигаемся вперед» и «отступаем». Это изменение произошло 11/11/2012 в этом году, и я включил даты по обе стороны от этой линии DST ниже. Я использую ноутбук для Windows 7 для разработки, и мы позже будем развертывать его в ящике Unix. Postgres, по-видимому, обнаружил, что мой компьютер Windows установлен в восточный часовой пояс США. Я пытаюсь сделать это с полем «timestamp without time zone» и поле «timestamp with time zone», но не может заставить его работать.

Я пытался использовать «в часовом поясе» в своих настройках, и каждая вещь работает, пока не наступит время для отображения часового пояса. Фактический час является частью отметки времени, правильно вычитаемой на час, когда я прошу время в CDT. Но на выходе отображается EDT.

SELECT reading_time as raw, 
     reading_time at time zone 'CDT', 
     to_char(reading_time at time zone 'CDT', 
      'MM/DD/YYYY HH12:MI AM TZ') as formatted_time 
    FROM readings2; 

"2012-04-29 17:59:35.65";"2012-04-29 18:59:35.65-04";"04/29/2012 06:59 PM EDT" 
"2012-04-29 17:59:40.19";"2012-04-29 18:59:40.19-04";"04/29/2012 06:59 PM EDT" 
"2012-03-10 00:00:00";"2012-03-10 00:00:00-05";"03/10/2012 12:00 AM EST" 
"2012-03-11 00:00:00";"2012-03-11 00:00:00-05";"03/11/2012 12:00 AM EST" 
"2012-03-12 00:00:00";"2012-03-12 01:00:00-04";"03/12/2012 01:00 AM EDT" 

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

Благодарим за помощь.

+1

Было бы полезно, если бы вы могли опубликовать вывод '' 'd d ''' s '' psql' здесь. – vyegorov

ответ

15

Вместо использования имен часовых поясов, таких как CDT или CST, вы можете использовать full Olsen-style time zone names. В случае центрального времени вы можете выбрать часовой пояс. Любой, который соответствует вашему местоположению, например America/Chicago, или просто US/Central. Это гарантирует, что PostgreSQL использует базу данных Olsen tz для автоматического определения того, применяется ли летнее время в любой заданной дате.

5

Вы определенно хотите столбец TIMESTAMP WITH TIME ZONE (который также известен как timestamptz в PostgreSQL). Это будет хранить временную метку в UTC, чтобы она представляла определенный момент времени. Вопреки тому, что предлагает название, оно не сохранить часовой пояс в столбце - вы можете просмотреть полученную временную метку в выбранном вами часовом поясе с помощью фраз AT TIME ZONE.

Семантика TIMESTAMP БЕЗ ВРЕМЕННОЙ ЗОНЫ сбивает с толку и почти бесполезна. Я настоятельно рекомендую вам не использовать этот тип вообще для того, что вы описываете.

Я действительно смущен частью вопроса, который рассказывает о хранении метки времени в столбце CHARACTER VARYING. Кажется, что это может быть частью проблемы. Если вы можете сохранить его в timestamptz с самого начала, я подозреваю, что у вас будет меньше проблем. Если это исключить, было бы безопаснее использовать нотацию -04 для смещения от UTC; но мне кажется, что мне больше не нужна никакая выгода.

+1

Чтобы добавить ответ, здесь ссылка на это глубже: http://phili.pe/posts/timestamps-and-time-zones-in-postgresql/ – jgburet

1

Вы можете создать таблицу известных часовых поясов в формате, предложенном в Guan Yang's answer, а затем использовать столбец внешнего ключа в этой таблице. Действительные временные интервалы могут быть получены от pg_timezone_names. Я подробно рассмотрел в this related answer.

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