Подтвердить что ты не робот

Лучшая практика хранения даты в MySQL с PHP

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

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

@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 по причинам, упомянутым выше, в том, что их гораздо легче читать и манипулировать (у меня довольно много прямого доступа к таблице), Однако в последнее время я начал переосмысливать этот подход по двум причинам:

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

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

Ответ 5

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

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

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

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

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

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

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

Ответ 6

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

select * from table where ...

довольно приятно.

Ответ 7

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