Лучшая практика для сохранения даты в MySQL из PHP - PullRequest
25 голосов
/ 12 июля 2009

Я всю жизнь использовал метку времени Unix.

Мне нравится, потому что это легко сравнивать, это быстро, потому что я храню его как целое число. А поскольку я использую PHP, я могу получить любой формат даты / времени с функцией date () из метки unixtime.

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

Действительно ли лучше использовать DATETIME, если да, каковы преимущества?

Спасибо.

Ответы [ 7 ]

31 голосов
/ 12 июля 2009

Если вы храните даты в виде меток времени Unix в базе данных, вы возлагаете большие усилия. Вы должны конвертировать их в форматы, которые вы хотите использовать, вы должны выполнять вычисления между диапазонами дат, вы должны строить запросы для получения данных в диапазоне. Это кажется нелогичным - ведь ваше «время программиста» лучше всего тратить на решение реальных проблем?

Кажется, гораздо лучше хранить даты и время в надлежащем формате, который есть в MySQL, а затем использовать функции базы данных для создания запросов на нужные вам данные. Время, которое вы потратили бы на все преобразования и разбрасывание, огромно по сравнению с днем, потраченным на чтение (и понимание) 11.6 MySQL Date and Time Функции

8 голосов
/ 07 ноября 2014

Я также был большим поклонником метки времени Unix всю свою жизнь. Но я думаю, что правильный ответ: «зависит». Недавно я создал базу данных с одной таблицей, в которой хотел перечислять только URL-адреса. Было бы поле даты, но поле даты предназначено исключительно для сортировки. Т.е. заказ по last_crawled. Это означает, что я никогда не буду использовать какие-либо встроенные функции даты в этом поле. Это просто простой способ сначала получить самые старые записи, и я никогда не буду применять функции даты к этому полю. Теперь, если бы я сделал это поле даты, я бы потерял две вещи:

  1. Поле даты и времени в два раза больше целого числа
  2. Сортировка по целому быстрее

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

7 голосов
/ 12 июля 2009

Одним из преимуществ использования типов даты / времени MySQL является возможность более простого использования функций даты / времени в MySQL .

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

Лично я склонен использовать базу данных как просто дамп данных, поэтому такие функции мало интересны. В PHP я, как правило, просто храню дату в целочисленном формате по причинам, которые вы указали.

6 голосов
/ 23 мая 2012

@ Smita V, неэффективный запрос, на который вы ссылаетесь, только потому, что вы неправильно применяете свою функцию преобразования к каждой строке таблицы, где вы должны применить ее к самому условию. Так что вместо

select col1,col2,colUnixdatetime from table where From_Unixtime(colUnixdatetime) between wtvdate1 and wtvdate2

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

select col1,col2,colUnixdatetime from table where colUnixdatetime between UNIX_TIMESTAMP(wtvdate1) and UNIX_TIMESTAMP(wtvdate2). 

При таком способе будут использоваться соответствующие индексы таблиц.

@ treznik Некоторое время назад я перешел от целого числа uts к типам данных datetime или timestamp, по причинам, указанным выше, в том смысле, что их гораздо проще читать и манипулировать ими (я довольно часто использую прямой доступ к таблицам) , Однако в последнее время я начал переосмысливать этот подход по двум причинам:

  1. Нет сохраненного местоположения часового пояса, поэтому вы выводите часовой пояс на основе вашего местоположения. Это может или не может быть проблемой для вас.
  2. Он игнорирует переход на летнее время. Таким образом, когда часы возвращаются в 2 часа ночи, вы получите 1:30 утра дважды, и если вы скажете, что 2011-10-30 01:30 не даст вам знать об этом, тогда как 1319938200 знает. Я не думаю, что в mysql есть собственный способ хранить дату, включая часовой пояс, кроме как в виде строки (2011-10-30 01:30 BST).

Я все еще пытаюсь сам найти ответ на этот вопрос.

3 голосов
/ 10 февраля 2010

Использование базы данных datetime более эффективно, потому что каждый раз, когда вам нужно выполнить запрос, вам необходимо применять функцию from_unixtime () для извлечения данных из столбца unix datetime таблицы. Использование этой функции в предложении where полностью игнорирует любое использование индекса.

скажите, что мой запрос:

выберите col1, col2, colUnixdatetime из таблицы, где colUnixdatetime между wtvdate1 и wtvdate2

Мне нужно запустить:

выберите col1, col2, colUnixdatetime из таблицы, где From_Unixtime (colUnixdatetime) между wtvdate1 и wtvdate2

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

Любая встроенная функция, используемая в LHS условия в условии where, не будет использовать никаких индексов, и если у вас огромная таблица, ваш запрос займет больше времени.

2 голосов
/ 12 июля 2009

Простота обслуживания - это плюс. Видя фактическую дату, когда вы делаете:

select * from table where ...

довольно мило.

1 голос
/ 12 июля 2009

Легче сравнивать, и MySQL предоставляет множество функций даты.

...