Отметка времени с ошибкой часового пояса в postgresql до 1892 г. - PullRequest
0 голосов
/ 03 января 2019

Я хочу добавить «метку времени с часовым поясом» до 1892 года в базе данных PostgreSQL, но когда я пытаюсь это сделать, я получаю метку времени, например «1892-05-01 11: 59: 59 + 00: 17: 30», которая не обычный часовой пояс.

Я пробовал некоторые значения, и, похоже, проблема возникает для всех значений до 11:42 1892/05/01 (UTC + 0), и ни одного после.

SELECT '1892-05-03T03:00:00+01:00'::timestamp with time zone;

Это дает мне 1892-05-03 02:00:00+00, что ожидается.

SELECT '1892-04-15T03:00:00+01:00'::timestamp with time zone;

Это дает мне 1892-04-15 02:17:30+00:17:30, что неправильно.

Я читал, что это, вероятно, связано с обработкой часового пояса PostgreSQL, но возможно ли обойти это без удаления аргумента часового пояса столбца?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

1892-04-15 02:17:30+00:17:30 не является неправильным .Все эти timestamptz литералы представляют один и тот же момент времени:

1892-05-03 03:00:00+01:00
1892-05-03 02:17:30+00:17:30
1892-05-03 02:00:00+00

См .:

Корень путаницы в том, что время не было хорошо стандартизировано до конца 19-го века.Регионы или даже города имели свои часовые пояса.До этого местное среднее время было "современным".И в основном просто солнечные часы до этого.Примерно в конце 19-го века одна европейская страна / регион за другим начала стандартизировать время.Пример: Википедия об истории CET в Центральной Европе .

Руководство Postgres о часовых поясах:

Часовые пояса иСоглашения о часовых поясах зависят от политических решений, а не только от геометрии Земли.В 1900-х годах часовые пояса во всем мире стали несколько стандартизированными, но по-прежнему подвержены произвольным изменениям, особенно в отношении правил перехода на летнее время.PostgreSQL использует широко используемую базу данных часовых поясов IANA (Olson) для получения информации о исторических правилах часовых поясов.[...]

По-видимому, произошли изменения в вашем нераскрытом часовом поясе около 1892-05-01 11: 42.

Чтобы разобраться в этом, вынеобходимо принять во внимание:

  • Настройка часового пояса текущего сеанса.

    • Если это localtime, посмотрите настройку местного времени вашего клиент ОС.Узнайте с помощью date +%Z в оболочке Unix (на вашем клиенте!).
  • Используемый вами клиент (разные клиенты имеют разные идеи о том, как представлять метки времени)

  • Ваша версия Postgres.База данных IANA tz постоянно обновляется для исправления исторических ошибок и добавления новых изменений.В настоящее время (Postgres 11.1) используется в соответствии с readme в исходном коде :

    Код в этом каталоге в настоящее время синхронизируется с выпуском tzcode 2018g .Существует много косметических (и не столь косметических) отличий от оригинальной библиотеки tzcode, но различия в предыдущей версии обычно распространяются на нашу версию.Вот некоторые заметки об этом.

Вы можете зависеть от точного выпуска Postgres (9.5.?), Так как обновления поставляются также с точечными выпусками.

Может быть, пересмотреть ваши фактические требования.Есть ли проблема?

0 голосов
/ 03 января 2019

Я сделал выбор и возвращает ожидаемый результат.См. Ниже:

postgres = # SELECT '1892-04-15T03: 00: 00 + 01: 00' :: отметка времени с часовым поясом;

отметка времени

1892-04-15 02: 00: 00 + 00 (1 строка)

Я использовал последнюю версию, какая у вас версия PostgreSql?

...