Spec-Zone.ru › MySQL 9.2

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'.. При использовании даты «ноль» через 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/using-date.html

Spec-Zone.ru

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