Spec-Zone .ru
спецификации, руководства, описания, API
|
Формат 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"
.