Как мне хранить объекты даты / времени в SQL? - PullRequest
2 голосов
/ 13 августа 2011

У меня был этот вопрос в течение длительного времени. Проблема заключается в следующем: большинство SQL-серверов, с которыми я работал (а именно MySQL), не хранят информацию о часовом поясе с датами, поэтому я предполагаю, что они просто хранят даты относительно местного часового пояса сервера. Это создает интересную проблему в случае, когда мне придется переносить серверы в разные часовые пояса, или если я создаю кластер с серверами, распределенными по разным центрам данных, или если мне нужно правильно перевести дату / время в локальные значения.

Например, если я сохраняю дату типа 2011-08-12 12:00:00 GMT-7, она сохраняется как 2011-08-12 12:00:00. Если у меня есть событие, которое происходит по всему миру в определенное время, я должен предположить, что мой сервер хранит даты в GMT-0700 (давайте даже не добавлять летнее время в микс), а затем преобразовать их в даты в зависимости от каждого местный часовой пояс пользователя. Если у меня есть несколько серверов, хранящих даты в своих часовых поясах, все это с треском проваливается.

Для таких сред, как Hibernate и Django, как они решают эту проблему, если вообще? Я что-то упустил или это серьезная проблема?

Ответы [ 3 ]

4 голосов
/ 13 августа 2011

На мой взгляд, лучший выбор:

  • Конвертировать все время в UTC при сохранении их в базе данных и локализовать их из UTC для отображения
  • Сохранение смещения UTC в минутах (по крайней мере, один современный часовой пояс кратен десятиминутному смещению от UTC) в отдельном столбце из даты / времени
  • Сохранить отметку времени в виде строки

В моем текущем проекте мы столкнулись с этой проблемой (мы используем Postgres) и решили хранить все время в UTC и конвертировать по мере необходимости в приложении. Для нас нет отдельного хранилища часового пояса. Мы также решили, что все взаимодействие клиент-сервер с использованием временных меток будет происходить в UTC, и что локальные часовые пояса будут учитываться ТОЛЬКО для взаимодействия с пользователем. Пока это хорошо сработало.

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

0 голосов
/ 13 августа 2011

Вы настолько правы, что я часто сталкиваюсь с этим и склонен искать TZ и сохранять его в статической таблице "VARS", чтобы, по крайней мере, я мог переместить его позже.

Примечания:

  • Интересное руководство DATETIME даже не упоминает об этом
  • На него влияют NOW () и CURTIME (), как показано здесь

НТН

0 голосов
/ 13 августа 2011

Ваш ответ для MySQL находится на этой странице Поддержка часового пояса MySQL Server

В основном MySQL предлагает автоматическую поддержку часового пояса для любых полей, которые используют поле UTC (отметка времени), но не для полей, которые не используют (поля даты, времени и даты и времени). Для полей UTC вы можете установить часовой пояс клиента, используя SET time_zone = timezone;. Для полей, отличных от UTC, вы должны рассчитать их самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...