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

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

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

Ответы [ 37 ]

13 голосов
/ 07 февраля 2016

Ссылка взята из этой статьи:

Основные отличия:

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

TIMESTAMP также зависит от настроек, связанных с TIME ZONE. DATETIME является постоянным.

TIMESTAMP внутренне преобразовал текущий часовой пояс в UTC для хранения, а во время поиска преобразовал обратно в текущий часовой пояс. DATETIME не может сделать это.

TIMESTAMP поддерживаемый диапазон: ‘1970-01-01 00:00:01 ′ UTC до 38 2038-01-19 03:14:07 ′ UTC DATETIME поддерживаемый диапазон: ‘1000-01-01 от 00:00:00 до 9999-12-31 23: 59: 59 ′

12 голосов
/ 24 февраля 2017

В моем случае я устанавливаю UTC как часовой пояс для всего: системы, сервера базы данных и т. Д. Каждый раз, когда могу. Если моему клиенту требуется другой часовой пояс, я настраиваю его в приложении.

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

В качестве плюса, в случае переноса базы данных в систему с другим часовым поясом, я бы чувствовал себя более уверенно, используя временные метки. Не говорить о возможных проблемах при расчете различий между двумя моментами с изменением времени Шумера между ними и с точностью до 1 часа или менее.

Итак, чтобы подвести итог, я ценю это преимущество отметки времени:

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

По всем этим причинам я выбираю поля UTC и отметки времени, где это возможно. И я избегаю головных болей;)

10 голосов
/ 07 марта 2014

Основная разница

  • ИНДЕКС на метку времени - работает
  • Индекс на Datetime - Не работает

посмотрите на этот пост , чтобы увидеть проблемы с индексированием Datetime

10 голосов
/ 01 ноября 2011

Я нашел непревзойденную полезность в способности TIMESTAMP автоматически обновлять себя, основываясь на текущем времени, без использования ненужных триггеров. Это только я, хотя TIMESTAMP - UTC, как было сказано.

Он может отслеживать разные часовые пояса, поэтому, если вам нужно, например, отобразить относительное время, то время в формате UTC - то, что вам нужно.

10 голосов
/ 19 января 2014

Другое различие между меткой времени и датой-временем заключается в том, что в метке времени нельзя установить значение по умолчанию NULL.

8 голосов
/ 12 апреля 2018
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
|                                       TIMESTAMP                                       |                                 DATETIME                                 |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
| TIMESTAMP requires 4 bytes.                                                           | DATETIME requires 8 bytes.                                               |
| Timestamp is the number of seconds that have elapsed since January 1, 1970 00:00 UTC. | DATETIME is a text displays 'YYYY-MM-DD HH:MM:SS' format.                |
| TIMESTAMP supported range: ‘1970-01-01 00:00:01′ UTC to ‘2038-01-19 03:14:07′ UTC.    | DATETIME supported range: ‘1000-01-01 00:00:00′ to ‘9999-12-31 23:59:59′ |
| TIMESTAMP during retrieval converted back to the current time zone.                   | DATETIME can not do this.                                                |
| TIMESTAMP is used mostly for metadata i.e. row created/modified and audit purpose.    | DATETIME is used mostly for user-data.                                   |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
8 голосов
/ 04 января 2009

Я предпочитаю использовать метку времени, чтобы хранить все в одном общем необработанном формате и форматировать данные в коде PHP или в вашем запросе SQL. Бывают случаи, когда в вашем коде удобно хранить все за несколько секунд.

7 голосов
/ 28 апреля 2011

Мне нравится метка времени Unix, потому что вы можете конвертировать в числа и просто беспокоиться о числе. Кроме того, вы добавляете / вычитаете и получаете длительности и т. Д. Затем конвертируете результат в дату в любом формате. Этот код определяет, сколько времени в минутах прошло между отметкой времени документа и текущим временем.

$date  = $item['pubdate']; (etc ...)
$unix_now = time();
$result = strtotime($date, $unix_now);
$unix_diff_min = (($unix_now  - $result) / 60);
$min = round($unix_diff_min);
6 голосов
/ 23 июня 2016

A TIMESTAMP требуется 4 байта, тогда как DATETIME требует 8 байтов.

4 голосов
/ 03 ноября 2016

Пока не упоминается, что DEFAULT CURRENT_TIMESTAMP работает только с отметкой времени, но не с полями типа DateTime.

Это становится актуальным для таблиц MS Access, которые могут использовать только DateTime, но не Timestamp.

...