Ответ 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.