Datetime vs Timestamp в MySQL и PHP на практике?

24

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

  • Текущая дата и время покупатель покупает товары с моего сайта: Datetime?
  • Дата и время доставки на основе их местоположения и даты / времени покупки, рассчитанные по нашей системе: Datetime?
  • Последний раз они заходили в свою учетную запись: Timestamp?

    1. Какой код в php для хранения даты покупки (текущей даты) и последующего сохранения в базе данных?
    2. Пожалуйста, опишите, как использовать каждый из них, так как после прочтения большого количества объяснений в Интернете я все еще не совсем понял.
модульная
источник
Некоторое время назад у меня был большой проект, в котором производительность была абсолютной необходимостью, после нескольких месяцев исследований, которые мы закончили с использованием метки времени UTC, хранящейся в поле varchar, она оказалась быстрее и лучше для наших нужд (большая социальная сеть)
JasonDavis

Ответы:

29

Временные метки MySQL :

  • Хранятся в UTC

    Они преобразуются в UTC при хранении и возвращаются в ваш часовой пояс при извлечении. Если вы измените настройки часового пояса , полученные значения также изменятся.

  • Может быть автоматически инициализирован и обновлен

    Вы можете установить их значение по умолчанию и / или значение автоматического обновления на CURRENT_TIMESTAMP

  • Иметь диапазон 1970-01-01 00:00:01 UTCдо2038-01-19 03:14:07 UTC

Принимая во внимание, что дата и время MySQL :

  • То, что вы храните, это то, что вы получаете ™.

  • Иметь диапазон 1000-01-01 00:00:00до9999-12-31 23:59:59

    Значения вне диапазона могут работать, но гарантированно будут работать только значения в пределах диапазона .

  • Вы можете хранить даты, когда день или месяц равен нулю.

    Это MySQL способ хранения дней рождения! Вы не можете сделать это с a TIMESTAMP, с единственным исключением, являющимся нулевым значением 0000-00-00.

  • Вы можете хранить недействительные даты, если они вам нужны, в режиме ALLOW_INVALID_DATES .

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

И, конечно, есть DATEи такие TIME, которые работают точно так же, как DATETIME, но, конечно DATE, не заботятся о времени и TIMEне заботятся о дате. Все четыре типа данных отлично работают с широким набором функций даты и времени , но когда вы смешиваете типы данных, вы должны знать о эффектах преобразования .

Теперь к вашему вопросу: вы должны использовать DATETIMEвезде. Не по техническим причинам, но, поскольку вы все еще не знаете, как работает MySQL, DATETIMEэто более простой выбор. Это будет означать, что вам нужно вычислить текущую временную метку в PHP перед сохранением, это так же просто, как:

$mysqldate = date("Y-m-d H:i:s"); 

Функция даты в PHP работает так:

string date ( string $format [, int $timestamp = time() ] )

"Y-m-d H:i:s"Формат является совместимым с MySQL и оставив второй параметр пустым, date()требует , time()чтобы получить текущий UNIX метку времени .

Использование TIMESTAMPвместо a DATETIMEимеет добавленную ценность MySQL, принимая на себя ответственность за выбор текущей метки времени, и вы можете пропустить поле при вставке / обновлении. Но так как вы уже отправляете запрос, а код для получения текущей временной метки в PHP минимален, вы можете смело идти DATETIMEна все.

Что касается фактического кода для хранения метки времени PHP в базе данных, вы должны посмотреть на объекты данных PHP , и если вам все еще неясно, спросите вместо этого StackOverflow . Но уже есть почти 1,5 тыс. Связанных вопросов , обязательно просмотрите их, прежде чем задавать вопросы. Просто подсказка, готовые заявления - вот как это делают крутые дети.

Яннис
источник
Хм, это может быть проблемой с тем, как вы отправляете запрос в MySQL, или в вашей структуре таблиц ... StackOverflow - лучшее место для подобных проблем, разместите там вопрос со структурой вашей таблицы и вашим полным php-кодом, и некоторые подробности о том, в чем проблема и что вы уже пробовали. Мы не обсуждаем здесь особенности реализации ...
Яннис
Спасибо за ваш ответ. Я пытался использовать $ mysqldate = date ("Ymd H: i: s"); $ query = INSERT INTO table VALUE ('". $ mysqldate.") в моем php-коде, но он будет храниться в MySQL как 0000-00-00 00:00:00 в Date (поле) - Datetime (тип данных). Я намерен хранить текущие дату и время. Если я установлю тип данных как Timestamp в базе данных, как кодировать в php?
Модульный
Мне не разрешено оставлять комментарии на Stackoverflow в данный момент. Звучит немного стыдно, но так они поступили со мной.
Модульный
Я прошу прощения за это, но если вы находитесь в режиме временного приостановления, должна быть веская причина. Теперь одна возможная ошибка в коде в вашем комментарии о том, что вы называете поле как Date, это зарезервированное слово для DATEтипа данных, и могут произойти странные вещи (в зависимости от версии MySQL), поэтому попробуйте переименовать его в нечто похожее creationdateи посмотреть, что произойдет , Кроме того, из PHP вы должны обращаться с TIMESTAMPполями так же, как с DATETIMEполями, на самом деле это не имеет значения. Их формат одинаков.
Яннис
Бесконечно благодарен. Это было отсортировано сейчас, проведя почти всю ночь, пытаясь понять, почему. :)
Модульный
2

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

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

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

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

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

Диапазон поддерживаемых TIMESTAMP: '1970-01-01 00:00:01' UTC до '2038-01-19 03:14:07' DTC DETETIME UTC Поддерживаемый диапазон: '1000-01-01 00:00:00' до '9999 -12-31 23:59:59 ′

Anvesh
источник
1
Так что в 2040 году, что бы вы использовали для изменения записей, Timestamp? Я думаю, нет.
Bsienn
-1

Я смотрю на это очень просто. В вашем случае я бы использовал и то datetimeи другое timestamp. При использовании обоих у вас не будет никаких дополнительных проблем с хранением данных или чем-то в этом роде. Одно дополнительное поле (столбец) в вашей таблице также не является большой проблемой.

Так что, с моей точки зрения и опыта, я обычно использую оба. Если вы хотите показать дату своему посетителю или сделать ее понятной для посетителей, тогда отобразите дату в формате datetime.

Формат даты и времени может быть проблематичным, если вы хотите что-то посчитать (разница между двумя датами, получение вчерашней даты от текущей даты, получение 1 недели назад от текущей даты, получение даты завтра или что-то в этом роде). Это не очень сложно, но обычно нужно конвертировать их, timestampа затем делать вещи. И да, текущая дата и время, например, у вас есть: $current = date("Y-m-d");или $current = date("Y-m-d H:i:s");если вы также хотите часы, минуты и секунды.

Отметка времени - это всего лишь 11-значный номер, который на самом деле ничего не «значит». Когда вы посмотрите на него, вы не будете знать, какую дату он представляет. Так что это не очень удобно для пользователя, и вы не можете использовать его, чтобы просто повторить его и показать своим посетителям, например. Вам нужно будет «превратить» его во что-то читабельное. Но он также предлагает вам возможность легко конвертировать и рассчитывать различные даты. Например, если вы хотите получить отметку времени на завтра одновременно, вы просто добавляете количество секунд к текущей дате и у вас есть отметка времени завтрашнего дня. Пример: $tomorrow = time()+24*3600;Вы также можете легко получить разницу между двумя датами в секундах или чем-то подобным.

Поэтому я бы предложил использовать дату и время. Даже если вы используете, например, PhpMyadmin и хотите быстро просмотреть некоторые данные, вам будет легче, если вы увидите дату в формате даты-времени (пример 2011-12-20 10:15:20:), как это будет, если вы просто посмотрите на 11-значный номер. Так что используйте оба, а затем позвоните и используйте тот, который подходит вам лучше.

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

отметка
источник
1
-1 Timestamp is just a number 11 digit long which doesn't really "mean" anythingвременные метки MySQL хранятся в том же формате, что и дата / время. Вам также необходимо преобразовать их в временные метки php, чтобы выполнить вычисления, которые вы описываете, ИЛИ просто использовать многие функции даты / времени MySQL и выполнять вычисления в базе данных. Ваш ответ на самом деле не имеет смысла.
Яннис