Дата MySQL или время PHP?

http://ejohn.org/blog/javascript-micro-templating/ - чертовски блестящий взлом для этого. Конечный результат очень чистый.

19
задан mpen 10 June 2009 в 20:28
поделиться

9 ответов

Диапазон:

Всегда есть очевидный недостаток: диапазон, который вы можете хранить, ограничен от 1970 до 2038. Если вам нужно хранить даты за пределами этого диапазона, вам обычно понадобится использовать другой формат. Чаще всего это применяется к датам рождения.

Читаемость:

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

Индексы:

Хорошая техническая причина для использования типов даты заключается в том, что в некоторых случаях это позволяет выполнять индексированный запрос, который не поддерживает временные метки unix. т. Рассмотрим следующий запрос:

SELECT * FROM tbl WHERE year(mydate_field) = 2009;

Если mydate_field имеет собственный тип даты и в поле есть индекс, этот запрос фактически будет использовать индекс, несмотря на вызов функции. Это практически единственный раз, когда mysql может оптимизировать вызовы функций для таких полей. Соответствующий запрос к полю отметки времени не сможет использовать индексы:

SELECT * FROM tbl WHERE year(from_unixtime(mytimestamp_field)) = 2009;

Если вы немного задумаетесь, то есть способ обойти это. Этот запрос делает то же самое, и сможет использовать оптимизацию индекса:

SELECT * FROM tbl WHERE mytimestamp_field > unix_timestamp("2009-01-01") AND mytimestamp_field < unix_timestamp("2010-01-01");

Вычисления:

Как правило, я сохраняю даты как время unix, несмотря на недостатки. На самом деле это не основано на его достоинствах, а скорее потому, что я к этому привык. Я обнаружил, что это упрощает одни вычисления, но усложняет другие. Например, очень сложно добавить месяц к отметке времени unix, поскольку количество секунд в месяц варьируется. Это очень просто использовать функцию mysql DATE_ADD (). Тем не мение, Я думаю, что в большинстве случаев это действительно упрощает расчеты. Например, довольно часто вы хотите выбрать сообщения, скажем, за последние два дня. Если поле содержит временную метку unix, это можно легко сделать, просто выполнив:

SELECT * FROM tbl WHERE mytimestamp_field > time() - 2*24*3600;

Это, вероятно, дело вкуса, но я лично считаю это быстрее и проще, чем необходимость запоминать синтаксис такой функции, как DATE_SUB ().

Часовые пояса:

Временные метки Unix не могут хранить данные часовых поясов. Я живу в Швеции, где один часовой пояс, так что для меня это не проблема. Однако это может стать большой проблемой, если вы живете в стране, которая охватывает несколько часовых поясов.

Если поле содержит временную метку unix, это можно легко сделать, просто выполнив:

SELECT * FROM tbl WHERE mytimestamp_field > time() - 2*24*3600;

Это, вероятно, дело вкуса, но я лично считаю это быстрее и проще, чем необходимость запоминать синтаксис такой функции, как DATE_SUB ().

Часовые пояса:

Временные метки Unix не могут хранить данные часовых поясов. Я живу в Швеции, где один часовой пояс, так что для меня это не проблема. Однако это может стать большой проблемой, если вы живете в стране, которая охватывает несколько часовых поясов.

Если поле содержит временную метку unix, это можно легко сделать, просто выполнив:

SELECT * FROM tbl WHERE mytimestamp_field > time() - 2*24*3600;

Это, вероятно, дело вкуса, но я лично считаю это быстрее и проще, чем необходимость запоминать синтаксис такой функции, как DATE_SUB ().

Часовые пояса:

Временные метки Unix не могут хранить данные часовых поясов. Я живу в Швеции, где один часовой пояс, так что для меня это не проблема. Однако это может стать большой проблемой, если вы живете в стране, которая охватывает несколько часовых поясов.

24
ответ дан 30 November 2019 в 02:45
поделиться

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

9
ответ дан 30 November 2019 в 02:45
поделиться

Раньше я делал то же самое, но теперь я храню его как MySQL DateTime - просто потому, что это означает, что при просмотре необработанных данных в базе данных я могу легко их интерпретировать.

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

4
ответ дан 30 November 2019 в 02:45
поделиться

Вы можете определите пункт автоматического обновления для меток времени MySQL в определении вашей таблицы.
http://dev.mysql.com/doc/refman/5.0/en/timestamp.html

3
ответ дан 30 November 2019 в 02:45
поделиться

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

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

3
ответ дан 30 November 2019 в 02:45
поделиться

Есть много недостатков:

  • Отсутствие точности; Время Unix только с точностью до секунды и только для дат между 13 декабря 1901 г. и 19 января 2038 г. при использовании типичного 32-битного целого числа
  • . Вы не можете использовать какие-либо встроенные функции базы данных для запроса или манипулировать данными
  • Вы не можете сохранить часовой пояс

Если вам нужен time_t , его достаточно легко преобразовать в него в коде.

2
ответ дан 30 November 2019 в 02:45
поделиться

Я могу вспомнить только пару:
* Если другое приложение, отличное от PHP, должно использовать базу данных, это будет трудночитать в формате.
* Если вы хотите выполнить какую-либо работу на основе SQL для этих дат (например, добавить месяц или получить все значения за определенный год и т. Д.), Это будет сложнее.

1
ответ дан 30 November 2019 в 02:45
поделиться

Небольшая потеря деталей. Переменная MySQL Datetime может быть очень точной.

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

1
ответ дан 30 November 2019 в 02:45
поделиться

Это неплохо, но вы потеряете некоторые встроенные функции, такие как:

select * from table1, где dateColumn = getDate () - 30

Используйте datetime, если можете !

0
ответ дан 30 November 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: