Должен ли я использовать тип данных datetime или timestamp в MySQL? - PullRequest
2503 голосов
/ 03 января 2009

Вы бы порекомендовали использовать поле datetime или timestamp и почему (используя MySQL)?

Я работаю с PHP на стороне сервера.

Ответы [ 37 ]

38 голосов
/ 18 февраля 2016

2016 + : я советую установить часовой пояс Mysql на UTC и использовать DATETIME:

Любая недавняя интерфейсная среда (Angular 1/2, реагировать, Vue, ...) может легко и автоматически преобразовывать дату и время UTC в местное время.

Дополнительно:

(Если вы, вероятно, не измените часовой пояс своих серверов)


Пример с AngularJs

// back-end: format for angular within the sql query
SELECT DATE_FORMAT(my_datetime, "%Y-%m-%dT%TZ")...

// font-end Output the localised time
{{item.my_datetime | date :'medium' }}

Весь локализованный формат времени доступен здесь: https://docs.angularjs.org/api/ng/filter/date

34 голосов
/ 03 января 2009
Поле

A timestamp является частным случаем поля datetime. Вы можете создать timestamp столбцы, чтобы иметь специальные свойства; он может быть настроен на обновление при создании и / или обновлении.

В «больших» терминах базы данных, timestamp содержит пару триггеров специального случая.

Какой правильный выбор полностью зависит от того, что вы хотите сделать.

30 голосов
/ 26 августа 2010

TIMESTAMP всегда находится в UTC (то есть, прошедшие секунды с 1970-01-01 в UTC), и ваш сервер MySQL автоматически преобразует его в дату / время для часового пояса соединения. В долгосрочной перспективе TIMESTAMP - это путь, потому что вы знаете, что ваши временные данные всегда будут в UTC. Например, вы не испортите даты, если перенесетесь на другой сервер или измените настройки часового пояса на вашем сервере.

Примечание: часовой пояс соединения по умолчанию - часовой пояс сервера, но его можно (нужно) изменить за сеанс (см. SET time_zone = ...).

26 голосов
/ 11 августа 2017

Сравнение DATETIME, TIMESTAMP и DATE

enter image description here

Что это за [.fraction]?

  • Значение DATETIME или TIMESTAMP может включать в себя конечный дробный секунды с точностью до 6 микросекунд (6 цифр). В в частности, любая дробная часть в значении, вставленном в DATETIME или столбец TIMESTAMP сохраняется, а не удаляется. Это, конечно, необязательно.

Источники:

24 голосов
/ 07 января 2012

Стоит отметить, что в MySQL вы можете использовать что-то вроде следующего при создании столбцов таблицы:

on update CURRENT_TIMESTAMP

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

21 голосов
/ 03 января 2009

Я бы всегда использовал метку времени Unix при работе с MySQL и PHP. Основной причиной этого является то, что метод PHP по умолчанию date использует метку времени в качестве параметра, поэтому анализ не требуется.

Чтобы получить текущую метку времени Unix в PHP, просто наберите time();
а в MySQL делай SELECT UNIX_TIMESTAMP();.

16 голосов
/ 06 февраля 2012

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

Например, рассмотрим таблицу user с полем РЕГИСТРАЦИЯ . В этой таблице user, если вы хотите узнать время последнего входа определенного пользователя, укажите поле типа timestamp , чтобы оно обновлялось.

Если вы создаете таблицу из phpMyAdmin , настройка по умолчанию обновит поле timestamp , когда произойдет обновление строки. Если ваша временная метка не обновляется при обновлении строки, вы можете использовать следующий запрос, чтобы поле timestamp получило автоматическое обновление.

ALTER TABLE your_table
      MODIFY COLUMN ts_activity TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
15 голосов
/ 20 декабря 2012

Тип данных временной метки хранит дату и время, но в формате UTC, а не в текущем формате часового пояса, как дата и время. И когда вы выбираете данные, отметка времени снова преобразует их в текущее время часового пояса.

Предположим, вы находитесь в США и получаете данные с сервера, который имеет часовой пояс США. Тогда вы получите дату и время в соответствии с часовым поясом США. Столбец типа данных временной метки всегда обновляется автоматически при обновлении его строки. Поэтому может быть полезно отследить, когда конкретная строка была обновлена ​​в последний раз.

Более подробно вы можете прочитать в блоге Метка времени против даты и времени .

14 голосов
/ 05 января 2012

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

Еще одна вещь, заслуживающая рассмотрения:

Если вы создаете приложение, вы никогда не знаете, как, возможно, придется использовать ваши данные в будущем. Если вам придется, скажем, сравнить кучу записей в вашем наборе данных, скажем, с кучей элементов от стороннего API, и, скажем, расположить их в хронологическом порядке, вы будете рады получить Unix метки времени для ваших строк. Даже если вы решите использовать метки времени MySQL, сохраните метку времени Unix в качестве страховки.

14 голосов
/ 04 октября 2013

Остерегайтесь изменения метки времени при выполнении оператора UPDATE для таблицы. Если у вас есть таблица со столбцами «Name» (varchar), «Age» (int) и «Date_Added» (timestamp), и вы выполняете следующую инструкцию DML

UPDATE table
SET age = 30

тогда каждое отдельное значение в вашем столбце 'Date_Added' будет изменено на текущую метку времени.

...