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

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

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

Ответы [ 37 ]

4 голосов
/ 23 мая 2016

Я просто использую без знака BIGINT при хранении UTC ...

, который затем можно настроить на местное время в PHP.

DATETIME, который будет выбран с FROM_UNIXTIME( integer_timestamp_column ).

очевидно, следует установить индекс для этого столбца, иначе не будет никакого продвижения.

4 голосов
/ 27 октября 2016

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

3 голосов
/ 05 февраля 2019

Я перестал использовать datetime в своих приложениях после того, как столкнулся со многими проблемами и ошибками, связанными с часовыми поясами. ИМХО, используя timestamp лучше, чем datetime, в большинстве случаев .

Когда вы спрашиваете, который час? и ответ приходит как что-то вроде «2019-02-05 21:18:30», это не завершенный, не определенный ответ, потому что ему не хватает другой части, в каком часовом поясе? Вашингтон? Москва ? Пекин?

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

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

  1. Для удобства ваших клиентов вы хотите показать им время в зависимости от предпочитаемых часовых поясов, не заставляя их делать математику, и переводить время в значимый часовой пояс. все, что вам нужно, это изменить часовой пояс, и весь код вашего приложения будет одинаковым. (На самом деле вы всегда должны определять часовой пояс при запуске приложения или обработку запросов в случае PHP-приложений)

    SET time_zone = '+2:00';
    
  2. вы изменили страну, в которой находитесь, и продолжили работу по сохранению данных, просматривая их в другом часовом поясе (без изменения фактических данных).

  3. вы принимаете данные от разных клиентов по всему миру, каждый из них вставляет время в своем часовом поясе.

Короче

datetime = приложение поддерживает 1 часовой пояс (как для вставки, так и для выбора)

timestamp = приложение поддерживает любой часовой пояс (как для вставки, так и для выбора)


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

3 голосов
/ 28 июня 2016

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

1 голос
/ 29 марта 2019

Если вы хотите ГАРАНТИРОВАТЬ, ваше приложение НЕ будет работать в феврале 2038 года, используйте TIMESTAMP. Обратитесь к своему REFMAN за ДИАПАЗОНОМ поддерживаемых дат.

0 голосов
/ 06 июня 2019

Разница между датой и таймстампом

  1. Поддерживаемый диапазон для DATETIME составляет от «1000-01-01 00:00:00» до «9999-12-31 23:59:59», а для «TIMESTAMP» это «1970-01-01 00»: 00:01 UTC до 2038-01-09 03:14:07 UTC.

  2. До MySQL 5.6.4 TIMESTAMP требовало 4 байта (+3 байта за доли секунды) для хранения данных, в то время как DATETIME требуется 8 байтов (+3 байта за доли секунды).

  3. Начиная с MySQL 5.6.4, для DATETIME требуется 5 байтов + 3 дополнительных байта для хранения данных за доли секунды.

    4.В MySQL5 + значение TIMESTAMP конвертируется из текущего времени в UTC и наоборот, в то время как DATETIME не выполняет никакого преобразования.

  4. TIMESTAMP отличается от текущих настроек часового пояса, в то время как DATETIME остается постоянным. Данные TIMESTAMP могут быть проиндексированы, а данные DATETIME - нет.

  5. Запросы с DATETIME не будут кэшироваться, но запросы с TIMESTAMP будут кэшироваться.

0 голосов
/ 30 июня 2018

timestamp - текущее время события, записанного компьютером через Сетевой протокол времени (NTP) .

datetime - текущий часовой пояс, заданный в вашей конфигурации PHP .

...