Диапазон:
Всегда есть очевидный недостаток: диапазон, который вы можете хранить, ограничен с 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 не могут хранить данные часового пояса. Я живу в Швеции с одним часовым поясом, так что это не проблема для меня. Однако это может быть серьезной болью, если вы живете в стране, которая охватывает несколько часовых поясов.