Насколько распространены TIMESTAMPS над полями DATETIME? - PullRequest
3 голосов
/ 16 июня 2009

Я хочу, чтобы мой продукт, как и любой другой веб-продукт, извлекал информацию из моей базы данных и преобразовывал ее в часовой пояс пользователя перед отображением на странице. Я использую PHP и MySQL.

Является ли использование полей TIMESTAMP более распространенным, чем использование полей DATETIME?

Из моих исследований кажется, что при использовании полей DATETIME мне бы пришлось

  1. Хранить всю информацию о дате в UTC
  2. звоните date_default_timezone_set('UTC') каждый раз, когда приложение запускается
  3. вручную вычитать часы смещения UTC пользователя из дат, созданных с использованием функции date (), исходя из текущей даты / времени
  4. вручную вычитать часы смещения UTC пользователя из существующих дат, переданных и отформатированных по дате ()

Используя TIMESTAMPS для моих полей даты, кажется, что мне нужно будет выполнить только следующее, когда установлено соединение с базой данных: SET time_zone = 'часовой пояс пользователя' (например, America / Los_Angelos).

Учитывая это, я бы сделал вывод, что большинство людей склонны использовать TIMESTAMPs, а не DATETIME ... это точно?

Ответы [ 5 ]

2 голосов
/ 16 июня 2009

Нет, я не думаю, что это точно.

Как правило, вы используете datetime для хранения только этого - даты и времени, когда что-то происходит, когда оно поступает на ваш сайт. Вы используете метку времени, чтобы отслеживать, когда данные были введены на ваш сайт для использования вашей программой. временная метка не должна отслеживать часовые пояса, потому что вся работа происходит в часовом поясе вашего db-сервера, тогда как у datetime больше возможностей для ее правильного представления, чтобы иметь смысл как вывод для пользователя.

Итак, на вопрос «Что более распространено для представления данных о часовом поясе пользователя», я бы сказал, что ответ - DATETIME.

2 голосов
/ 16 июня 2009

С это местоположение:

Тип данных отметки времени SQL Server имеет не имеет ничего общего со временем или датами. SQL Отметки времени сервера являются двоичными числами которые указывают на относительную последовательность в какие изменения данных имели место в база данных. Тип данных отметки времени изначально был реализован для поддержки алгоритмы восстановления SQL Server.

Редактировать: для ответа на ваш вопрос чаще используется DATETIME, так как TIMESTAMP не предназначен для хранения общей информации о дате / времени.

1 голос
/ 16 июня 2009

Если вам нужно манипулировать часовым поясом и вам не нужно сохранять даты до 1970 или после 2038 года, используйте TIMESTAMPs.

Вы можете сделать один оператор SQL:

set timezone='America/New_York';

И все даты, извлеченные из базы данных, будут в EDT.

Я бы не стал делать математику со смещением UTC, поскольку становится трудно правильно обрабатывать все случаи. Лучше всего настроить часовые пояса PHP и MySQL соответствующим образом для каждого пользователя.

TIMESTAMP хранит даты ТОЛЬКО в формате UTC, и MySQL обрабатывает перевод для него.

При сохранении дат:

set time_zone='America/New_York';
insert into SomeTable ( Name, Created, Modified ) VALUES ( 'Dude', '2009-06-15 11:54:00', '2009-06-15 11:54:00');
set time_zone='GMT';
SELECT * FROM SomeTable ORDER BY ID DESC LIMIT 1;
+----+------+---------------------+---------------------+
| ID | Name | Created             | Modified            |
+----+------+---------------------+---------------------+
|  1 | Dude | 2009-06-15 15:54:00 | 2009-06-15 15:54:00 | 
+----+------+---------------------+---------------------+

Просто установите часовой пояс базы данных в зону, в которой находится пользователь, и он будет правильно "скрытно" преобразован в правильную дату по Гринвичу.

Просто убедитесь, что вы не «дважды конвертируете» даты в PHP и MySQL.

1 голос
/ 16 июня 2009

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

Если другой пользователь изменяет запись до того, как первый пользователь выполнит сохранение, TIMESTAMP, который прочитал первый пользователь, больше не будет соответствовать TIMESTAMP, который находится в базе данных. Что будет дальше, зависит от того, как система обрабатывает нарушения параллелизма. Некоторые системы будут препятствовать сохранению. Другие системы спросят первого пользователя, хотят ли они переписать изменения другого человека.

0 голосов
/ 16 июня 2009

TIMESTAMP отличается тем, что может быть автоматически обновлен при создании или изменении строки. См. документы с отметками времени .

По сути, если вы не хотите автоматического поведения со стороны MySQL, используйте DATETIME. DATETIME также может представлять больший диапазон.

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