Есть ли настройка MySQL, чтобы игнорировать часть времени константы datetime применительно к столбцу «DATE»? - PullRequest
0 голосов
/ 01 декабря 2009

Отказ от ответственности: это необходимо для старой и уродливой кодовой базы, которую я бы предпочел не трогать.

  • В базе данных есть таблица, в которой есть столбец (среди многих других) типа DATE.
  • Существует запрос (автоматически генерируемый по критериям Torque - не спрашивать) с параметром java.util.Date; Крутящий момент форматирует его как полное время-дата.

Итак, запрос, который получает MySQL, выглядит примерно так:

SELECT * FROM my_table
 WHERE my_date = '20091201105320'; // 2009-12-01 10:53:20

Проблема в том, что на одном сервере, который имеет стандарт MySQL 5.0.27, он работает просто отлично - как и в случае возврата всех записей из my_table, для которых my_date установлено в '2009-12-01'. На другом сервере, на котором установлен MySQL 5.0.45, он не работает. Данные есть - если я вручную выполню запрос после обрезки временной части, я получу верные результаты.

Вопрос:

Есть ли где-то настройка, либо в файле конфигурации MySQL, либо в переменных сеанса (строка подключения), либо где-то еще, чтобы заставить MySQL игнорировать часть времени при преобразовании строковой константы в дату?

Я, очевидно, не могу использовать функцию DATE() без изменения кодовой базы, которую я бы предпочел не делать.

Ответы [ 2 ]

1 голос
/ 09 января 2011

Это проще, чем исправление крутящего момента

Criteria cr = new Criteria();
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String fixedDate = dateFormat.format(date);
cr.add("my_date", (Object)("my_date = '" + fixedDate + "'"), Criteria.CUSTOM);
1 голос
/ 01 декабря 2009

Видимо мне не повезло. Из руководства MySQL :

До MySQL 5.0.42, когда значения DATE сравнивались со значениями DATETIME, временная часть значения DATETIME игнорируется или сравнение может выполняться как сравнение строк. Начиная с MySQL 5.0.42, значение DATE приводится к типу DATETIME путем добавления временной части как '00:00:00'.

Если кто-нибудь окажется в подобной ситуации, единственный найденный мной обходной путь:

  1. Сброс полей времени (часы / минуты / секунды) экземпляра java.util.Date на ноль.
  2. Patch (и я имею в виду «patch» - нет способа подключить собственный адаптер) getDateString() метод адаптера DB Torque для MySQL (org.apache.torque.adapter.DBMM), чтобы проверить, равны ли поля времени даты нулям , если это так, используйте формат «только для даты».
...