Я думаю, один из двух бичей ИТ являются метки времени и часовых поясов (другой кодировки), где одна продолжает снова и снова наткнулась ...PostgreSQL и тайна временных меток
В этой связи я в настоящее время есть проблема, связанная с различными временными метками в приложении Java, хранящемся в базе данных PostgreSQL.
Для хранения вещей простых, предположит, имеющие следующую таблицу:
CREATE TABLE ts_test
(
id integer NOT NULL,
utc timestamp without time zone,
local timestamp with time zone,
CONSTRAINT pk PRIMARY KEY (id)
)
Итак, я должен хранить время UTC штамп и местные один, который в моем случае является центральной Европой летнего времени, поэтому в настоящее время UTC +2.
Далее предположим, с 2 записей в таблице, которая выводится на консоль Psql следующим образом (база данных работает в формате UTC):
# select id, utc, local, local-utc as diff from ts_test;
id | utc | local | diff
----+---------------------+------------------------+----------
1 | 2012-06-27 12:00:00 | 2012-06-27 12:00:00+00 | 00:00:00
2 | 2012-06-27 12:00:00 | 2012-06-27 14:00:00+00 | 02:00:00
(2 rows)
Теперь возникает несколько вопросов:
- Что именно означает ли вывод в локальном столбце?
- Как система знает часовой пояс, я вставил значение в?
- Как я могу увидеть реальное необработанное значение (например, миллисекунды)?
Я предположил бы, что местная «12: 00: 00 + 00» первой линии означает, что в UTC - 12:00, а в 14:00 - в CEST. Но кажется (и так мне сказал наш администратор базы данных), что локальная «14: 00: 00 + 00» 2-й строки является правильным значением для 14:00 CEST, которое поддерживается разницей в 2 часа.
Но для получения 2-й линии с помощью SQL вставки, я должен написать
insert into ts_test (id, utc, local) values (2, '2012-06-27 12:00:00', '2012-06-27 16:00:00+02');
, который снова не поддерживает предикации.
Итак, чтобы подвести итог этому длинному вопросу - может ли кто-нибудь просветить меня о том, как все это работает подробно, что должен означать вывод и как следует правильно писать локальные метки времени в базу данных? .
Часть '+ 00' - это замороженное смещение временной зоны. Вероятно, вы хотите записать фактическое имя часового пояса. Любой регион, который соблюдает DST, будет переходить из одного «часового пояса» в другой в течение года. В любом случае ваше местное время хранится как нулевое смещение, что означает UTC, что неверно. Более подробная информация содержится в документации по дате/времени Postgres (http://www.postgresql.org/docs/9.2/static/datatype-datetime.html). – tadman
@tadman: Спасибо за подсказку. Я уже рассматривал документацию PostgresQL, но пока не могу ответить на мою проблему. - Согласно странице, на которую вы ссылаетесь, она говорит, что временные метки всегда хранятся в формате UTC, но выводятся в конкретном часовом поясе.Итак, это одна из проблем, когда моя база данных работает в UTC, хотя я пишу локальные даты в CEST? Когда я изменяю параметр часового пояса на «Европа/Берлин», я получаю вывод +2 для всех местных жителей и разностей. Это снова поддержало бы мое предположение выше для 1-й линии, но мне сказали, что 2-я строка верна. * все еще озадачен * –
Тип столбца - это «временная метка с часовым поясом * смещение *», так как фактическая часовая зона, которая дала это смещение, не записывается. Есть много часовых поясов, которые являются UTC + 2 в разное время года. – tadman