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

Хранить неполную дату в поле даты MySQL

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

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

4b9b3361

Ответ 1

В документации для 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

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

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

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

Ответ 2

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

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