Spec-Zone.ru › MySQL 5.7

B.3.4.2 Проблемы с использованием столбцов DATE

Формат значения DATE составляет 'YYYY-MM-DD'. Согласно стандарту SQL, другие форматы недопустимы. Вы должны использовать этот формат в выражениях 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 обычно преобразует строку во внутреннее большое целое число для более быстрого сравнения (а также для немного более “расширенной” проверки строк). Однако это преобразование имеет следующие исключения:

  • При сравнении двух столбцов

  • При сравнении DATE, TIME, DATETIME или TIMESTAMP столбца с выражением

  • При использовании любого метода сравнения, отличного от перечисленных, такого как IN или STRCMP().

В этих исключениях сравнение выполняется путем преобразования объектов в строки и выполнения строкового сравнения.

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

Специальная дата “ноль” '0000-00-00' может быть сохранена и извлечена как '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 очень удобным для веб-приложений, где год, месяц и день получаются в трех разных полях, и вы хотите сохранить введенные пользователем данные без проверки даты.

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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/using-date.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API