B.3.4.2 Проблемы при использовании столбцов DATE
Формат значения типа DATE составляет '. Согласно стандарту SQL, другие форматы недопустимы. Вы должны использовать этот формат в выражениях YYYY-MM-DD'UPDATE и в фрагменте WHERE операторов SELECT. Например:
SELECT * FROM t1 WHERE date >= '2003-05-05';
Для удобства MySQL автоматически преобразует дату в число, если она используется в числовом контексте, и наоборот. MySQL также допускает «расслабленный» строковый формат при обновлении и в фрагменте WHERE, сравнивая дату со столбцом типа DATE, DATETIME или TIMESTAMP. «Расслабленный» формат означает, что любой знак препинания может использоваться в качестве разделителя между частями. Например, '2004-08-15' и '2004#08#15' эквивалентны. MySQL также может преобразовать строку без разделителей (например, '20040815'), если это имеет смысл в контексте даты.
При сравнении типа DATE, TIME, DATETIME или TIMESTAMP со строковой константой с помощью операторов <, <=, =, >=, > или BETWEEN, MySQL обычно преобразует строку во внутреннее длинное целое число для более быстрого сравнения (а также для более «расслабленной» проверки строк). Однако это преобразование имеет следующие исключения:
В этих случаях сравнение выполняется путем преобразования объектов в строки и последующего строкового сравнения.
Для большей безопасности считайте, что строки сравниваются как строки, и используйте соответствующие строковые функции, если вы хотите сравнить временную величину со строкой.
Специальная дата «ноль» '0000-00-00' может храниться и извлекаться как '0000-00-00'.. При использовании даты «ноль» через Connector/ODBC она автоматически преобразуется в NULL, так как ODBC не может обрабатывать этот тип даты.
Благодаря этим преобразованиям MySQL выполняет следующие операции (предполагается, что idate является столбцом типа 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' и не выполняет сравнение дат.
Если включен SQL-режим ALLOW_INVALID_DATES, MySQL позволяет хранить даты с ограниченной проверкой: MySQL требует, чтобы день был в диапазоне от 1 до 31, а месяц — от 1 до 12. Это очень удобно для веб-приложений, где год, месяц и день вводятся в отдельных полях, и вы хотите сохранить то, что ввел пользователь (без валидации даты).
MySQL позволяет хранить даты с нулевым днём или месяцем. Это удобно, если вы хотите сохранить дату рождения в столбце типа DATE, зная только часть даты. Чтобы запретить нулевые значения месяца или дня в датах, включите режим NO_ZERO_IN_DATE.
MySQL позволяет хранить значение «ноль» '0000-00-00' как «фиктивную дату». В некоторых случаях это удобнее, чем использование значений NULL. Если дата, которую нужно сохранить в столбце типа DATE, не может быть преобразована в приемлемое значение, MySQL сохраняет '0000-00-00'. Чтобы запретить '0000-00-00', включите режим NO_ZERO_DATE.
Для того чтобы MySQL проверял все даты и принимал только корректные даты (если не указано иначе в IGNORE), установите системную переменную sql_mode в значение "NO_ZERO_IN_DATE,NO_ZERO_DATE".
© 2025 Oracle
Licensed under the GPLv2 License.