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

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

Рассказывается о проблемах с выборками по столбцам типа DATE

Для значения DATE используется формат ' ГГГГ-ММ-ДД'. Согласно SQL-стандарту, любой другой формат является недопустимым.

Данный формат должен применяться в выражениях UPDATE и в конструкциях WHERE операторов SELECT, например:

 

Для удобства 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> SELECT i d a t e FROM имя_та блицы WHERE STRCMP(idate,'20030505')=0;

 

Функция STRCMP () является строковой, поэтому она преобразует idate в строку формата 'ГГГГ-ММ-ДД' и выполняет операцию по сравнению строк. Преобразовывать '20030505' в дату и сравнивать даты она не будет.

Сервер MySQL упаковывает даты для хранения, поэтому сохранить определенную дату, если она для буфера результатов не подходит, он не может. MySQL выполняет очень ограниченную проверку того, является ли та или иная дата правильной. При сохранении некорректно указанной даты, например, '2004-2-31', MySQL сохранит ее именно в таком виде. Поддерживаются следующие правила принятия дат:

  • Если MySQL может сохранять и извлекать дату в заданном формате, она принимается для столбцов DATE и DATETIME даже в случае, когда такой ее формат не является стопроцентно корректным.
  • Значения дней в интервале от 0 до 31 принимаются для любой даты. Это очень удобно для Web-приложений, в которых год, месяц и день указываются в трех разных полях.
  • Значение дня или месяца может быть равно нулю. Это удобно, когда, например, нужно сохранить дату рождения в столбце DATE, а она не известна полностью.

Если дата не может быть преобразована в какое-нибудь подходящее значение, в столбце DATE сохраняется значение 0, и при извлечении дата будет выглядеть как '0000- 00-00'. Делается это для удобства, а также из соображений, связанных с производительностью. Сервер баз данных должен извлекать дату в сохраненном вами виде (даже если эта дата не была логически корректной во всех случаях).

В любом случае помните, что за проверку дат отвечает приложение, а не сервер.

Нет комментариев.
Добавить комментарий
Вам необходимо включить показ изображений в браузере для того чтобы увидеть код

Дайте нам знать, что вы - живой человек. Для нас это важно!
Кликните, если плохо видно

Прежде чем высказать свое мнение, прочитайте пожалуйста: правила


Рейтинг@Mail.ru