http://ejohn.org/blog/javascript-micro-templating/ - чертовски блестящий взлом для этого. Конечный результат очень чистый.
Диапазон:
Всегда есть очевидный недостаток: диапазон, который вы можете хранить, ограничен от 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 не могут хранить данные часовых поясов. Я живу в Швеции, где один часовой пояс, так что для меня это не проблема. Однако это может стать большой проблемой, если вы живете в стране, которая охватывает несколько часовых поясов.
Одним из недостатков является то, что вы не можете управлять и запрашивать эти даты с использованием функций SQL.
Раньше я делал то же самое, но теперь я храню его как MySQL DateTime - просто потому, что это означает, что при просмотре необработанных данных в базе данных я могу легко их интерпретировать.
Другое чем это, возможно, легче работать с данными на других языках, которые не используют так много меток времени UNIX (как PHP), но в любом случае это не так уж и важно.
Вы можете определите пункт автоматического обновления для меток времени MySQL в определении вашей таблицы.
http://dev.mysql.com/doc/refman/5.0/en/timestamp.html
Временная метка UNIX имеет очевидные ограничения относительно диапазона дат, которые вы можете хранить.
Я также всегда использую поля DATETIME
. Вы можете выполнять много вычислений с DATE, используя SQL, поэтому вы можете извлекать полезную информацию, например DATEDIFF
, между текущим моментом и сохраненной датой, вообще не используя PHP.
Есть много недостатков:
Если вам нужен time_t
, его достаточно легко преобразовать в него в коде.
Я могу вспомнить только пару:
* Если другое приложение, отличное от PHP, должно использовать базу данных, это будет трудночитать в формате.
* Если вы хотите выполнить какую-либо работу на основе SQL для этих дат (например, добавить месяц или получить все значения за определенный год и т. Д.), Это будет сложнее.
Небольшая потеря деталей. Переменная MySQL Datetime может быть очень точной.
Кроме того, если вам нужно будет сравнивать даты в своей базе данных, формат даты содержит некоторые встроенные функции, которые вы не сможете использовать.
Это неплохо, но вы потеряете некоторые встроенные функции, такие как:
select * from table1, где dateColumn = getDate () - 30
Используйте datetime, если можете !