Сохранить неполную дату в поле даты MySQL - PullRequest
21 голосов
/ 30 июля 2011

Я хочу предложить пользователю возможность вводить даты, которые являются неполными (например, только 2005 год или январь 1998 года), но также содержат даты с указанием года, месяца, дня. Могу ли я сделать это, используя одно поле даты в БД?

Я пытался UPDATE tableA SET mydate = '2001-00-00', и, кажется, работает (без ошибок), но я не уверен, что это правильно. Внутренне я предполагаю, что используется временная метка, так как MySQL может представлять эти 0?

Ответы [ 3 ]

24 голосов
/ 30 июля 2011

В документации есть небольшая заметка для DATE_FORMAT () о том, что MySQL допускает неполные даты:

Диапазоны для спецификаторов месяца и дня начинаются с нуля из-за Тот факт, что MySQL позволяет хранить неполные даты, такие как '2014-00-00'.

Как указано @ wonk0 , MySQL установит недопустимые даты на 0000-00-00 00:00:00, если ALLOW_INVALID_DATES не задано. Однако, даже если ALLOW_INVALID_DATES не задано, вставка действительного года с нулем месяца и дня, по-видимому, не вызывает такого поведения - по крайней мере, в моем тестировании (MySQL 5.1.54-1ubuntu4). Я использовал эту функцию раньше без каких-либо проблем, но до сих пор не смог найти более подробную документацию, которая описывает это поведение полностью.

Сравнение даты и времени также работает должным образом: например, 2011-01-00 > 2011-00-00 и 2011-00-01 > 2011-00-00 делают так, как вы ожидаете.

UPDATE

См. этот ответ (другой Майк) на аналогичный вопрос. Это указывает на выдержку из Полное руководство по MySQL 5 :

В более старых версиях MySQL типы данных DATE и DATETIME делали только ограниченное количество типов проверки. Значения между 0 и 12 для месяцев, и 0 и 31 для дней, как правило, допускается Тем не менее, это ответственность клиентской программы за предоставление правильных данных. (За Например, 0 является допустимым значением для месяца или дня, чтобы обеспечить возможность хранения неполных или неизвестных данных.)

Начиная с MySQL 5.0.2, существует более тщательная проверка, поэтому что только действительные данные могут быть сохранены. Тем не менее разрешены месяц и дневные значения 0, а также дата 0000-00-00.

2 голосов
/ 30 июля 2011

Ну, если вы использовали поле даты, то вы должны ожидать эти 0.Один из способов избавиться от них - использовать выбор varchar.Тем не менее, лучше использовать поле даты, так как оно хранится там.

Если вам нужно разрешить пользователям вводить неполную дату, тогда она должна быть varchar, и в этом случае вы можете отформатировать ввод с помощью своего скрипта и сохранить в этом столбце

1 голос
/ 30 июля 2011

Хранение частей дат зависит от режима sql, в котором работает MySQL. Пожалуйста, прочитайте http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html,, особенно о недопустимых датах в http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_allow_invalid_dates.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...