Для значения DATE используется формат ' ГГГГ-ММ-ДД'. Согласно SQL-стандарту, любой другой формат является недопустимым.
Данный формат должен применяться в выражениях UPDATE и в конструкциях WHERE операторов SELECT, например:
mysql> SELECT * FROM имя_та блицы WHERE date >= '2009-05-05';
Для удобства MySQL автоматически преобразует дату в число, если дата используется в числовом контексте (и наоборот), а также допускает использование "ослабленной" строковой формы при обновлении и в конструкции WHERE, сравнивающей дату со столбцом TIMESTAMP, DATE или DATETIME.
"Ослабленная форма" означает, что в качестве разделителя между частями может применяться любой знак пунктуации. Например, * 2004- 08-15' и '2004#08#15' эквивалентны. MySQL может также преобразовывать строку, не содержащую разделителей (как, например, '20040815'), при условии что она имеет смысл в качестве даты. Специальную дату '0000-00-00' можно сохранять и извлекать в виде '0000-00-00'. При использовании даты типа '0000-00-00' через Connector/ODBC, в версии Connector/ ODBC 2.50.12 и выше она будет автоматически преобразовываться в NULL, поскольку ODBC не может обрабатывать такой формат даты.
Так как MySQL выполняет описанные выше типы преобразований, работать будут следующие операторы:
mysql> INSERT INTO имя_таблицы (idate) VALUES (19970505);mysql> INSERT INTO имя_таблицы (idate) VALUES ('19970505'); mysql> INSERT INTO имя_таблицы (idate) VALUES ('97-05-05'); mysql> INSERT INTO имя_таблицы (idate) VALUES ('1997.05.05'); mysql> INSERT INTO имя_таблицы (idate) VALUES ('1997 05 0 5 ' ) ; mysql> INSERT INTO имя_таблицы (idate) VALUES ('0000-00-00'); mysql> SELECT i d a t e FROM имя_ та блицы WHERE i d a t e >= '1997-05-05'; mysql> SELECT i d a t e FROM имя_таблицы WHERE i d a t e >= 19970505; mysql> SELECT MOD(idate,100) FROM имя_таблицы WHERE i d a t e >= 19970505; mysql> SELECT i d a t e FROM имя_та блицы WHERE i d a t e >= '19970505';
Однако, следующая конструкция работать не будет:
mysql> SELECT i d a t e FROM имя_та блицы WHERE STRCMP(idate,'20030505')=0;
Функция STRCMP () является строковой, поэтому она преобразует idate в строку формата 'ГГГГ-ММ-ДД' и выполняет операцию по сравнению строк. Преобразовывать '20030505' в дату и сравнивать даты она не будет.
Сервер MySQL упаковывает даты для хранения, поэтому сохранить определенную дату, если она для буфера результатов не подходит, он не может. MySQL выполняет очень ограниченную проверку того, является ли та или иная дата правильной. При сохранении некорректно указанной даты, например, '2004-2-31', MySQL сохранит ее именно в таком виде. Поддерживаются следующие правила принятия дат:
Если дата не может быть преобразована в какое-нибудь подходящее значение, в столбце DATE сохраняется значение 0, и при извлечении дата будет выглядеть как '0000- 00-00'. Делается это для удобства, а также из соображений, связанных с производительностью. Сервер баз данных должен извлекать дату в сохраненном вами виде (даже если эта дата не была логически корректной во всех случаях).
В любом случае помните, что за проверку дат отвечает приложение, а не сервер.
Комментарии