Spec-Zone .ru
спецификации, руководства, описания, API

C.5.5.2. Проблемы Используя DATE Столбцы

Формат a DATE значение 'YYYY-MM-DD'. Согласно стандартному SQL, не разрешается никакой другой формат. Следует использовать этот формат в UPDATE выражения и в WHERE пункт SELECT операторы. Например:

SELECT * FROM t1 WHERE date >= '2003-05-05';

Как удобство, MySQL автоматически преобразовывает дату в число, если дата используется в числовом контексте и наоборот. MySQL также разрешает "ослабленный" строковый формат, обновляя и в a WHERE пункт, который сравнивает дату с a DATE, DATETIME, или TIMESTAMP столбец. "Ослабленный" формат означает, что любой символ пунктуации может использоваться в качестве разделителя между частями. Например, '2004-08-15' и '2004#08#15' эквивалентны. MySQL может также преобразовать строку, не содержащую разделителей (такой как '20040815'), если это имеет смысл как дату.

Когда Вы сравниваете a DATE, TIME, DATETIME, или TIMESTAMP к постоянной строке с <, <=, =, >=, >, или BETWEEN операторы, MySQL обычно преобразовывает строку во внутреннее длинное целое для более быстрого сравнения (и также некоторое время более "ослабленная" строковая проверка). Однако, это преобразование подвергается следующим исключениям:

Для тех исключений сравнение делается, преобразовывая объекты в строки и выполняя сравнение строк.

Чтобы быть на безопасной стороне, предположите, что строки сравниваются как строки и используют соответствующие строковые функции, если Вы хотите сравнить временное значение со строкой.

Специальная "нулевая" дата '0000-00-00' может быть сохранен и получен как '0000-00-00'. Когда a '0000-00-00' дата используется через Соединитель/ODBC, она автоматически преобразовывается в NULL потому что ODBC не может обработать такую дату.

Поскольку MySQL выполняет преобразования, только описанные, следующая работа операторов (примите это idate a DATE столбец):

INSERT INTO t1 (idate) VALUES (19970505);INSERT INTO t1 (idate) VALUES ('19970505');INSERT INTO t1 (idate) VALUES ('97-05-05');INSERT INTO t1 (idate) VALUES ('1997.05.05');INSERT INTO t1 (idate) VALUES ('1997 05 05');INSERT INTO t1 (idate) VALUES ('0000-00-00');SELECT idate FROM t1 WHERE idate >= '1997-05-05';SELECT idate FROM t1 WHERE idate >= 19970505;SELECT MOD(idate,100) FROM t1 WHERE idate >= 19970505;SELECT idate FROM t1 WHERE idate >= '19970505';

Однако, следующий оператор не работает:

SELECT idate FROM t1 WHERE STRCMP(idate,'20030505')=0;

STRCMP() строковая функция, таким образом, она преобразовывает idate к строке в 'YYYY-MM-DD' отформатируйте и выполняет сравнение строк. Это не преобразовывает '20030505' к дате '2003-05-05' и выполните сравнение даты.

Если Вы включаете ALLOW_INVALID_DATES Режим SQL, MySQL разрешает Вам хранить даты, которые даются только ограниченную проверку: MySQL требует только, чтобы день был в диапазоне от 1 до 31, и месяц находится в диапазоне от 1 до 12. Это делает MySQL очень удобным для Веб-приложений, где Вы получаете год, месяц, и день в трех различных полях, и Вы хотите сохранить точно что введенный пользователь (без проверки допустимости даты).

MySQL разрешает Вам хранить даты, где день или месяц и день являются нулем. Это удобно, если Вы хотите сохранить дату рождения в a DATE столбец и Вы знаете только часть даты. Чтобы отвергнуть нулевые части месяца или дня в датах, включите NO_ZERO_IN_DATE Режим SQL.

MySQL разрешает Вам хранить "нулевое" значение '0000-00-00' как "фиктивная дата." Это в некоторых случаях более удобно чем использование NULL значения. Если дата, которая будет сохранена в a DATE столбец не может быть преобразован ни в какое разумное значение, хранилища MySQL '0000-00-00'. Отвергнуть '0000-00-00', включите NO_ZERO_DATE Режим SQL.

Чтобы иметь MySQL проверяют все даты и принимают только юридические даты (если не переопределено IGNORE), установите sql_mode системная переменная к "NO_ZERO_IN_DATE,NO_ZERO_DATE".