Как исправить Невозможно разобрать постоянную проблему «ДАТА» в базе данных H2? - PullRequest
0 голосов
/ 26 июня 2019

Я портирую свое приложение Java, разработанное для Windows, на AIX Unix. В Windows он использует SQL Server для настройки. В AIX мы пытаемся использовать базу данных H2. Большая часть кода работает, но я получаю следующую ошибку при выполнении запроса, который имеет критерии даты и времени.

org.h2.jdbc.JdbcSQLDataException: Cannot parse "DATE" constant "26-Jun-2019"; SQL statement:
SELECT EM_SCHEDULER_DAILY_POLL.* FROM EM_SCHEDULER_DAILY_POLL, EM_CONTROLLER WHERE EM_SCHEDULER_DAILY_POLL.CONTROLLER_ID =
EM_CONTROLLER.CONTROLLER_ID AND EM_SCHEDULER_DAILY_POLL.DATE_TIME
BETWEEN '26-Jun-2019' AND '26-Jun-2019 23:59:59' AND
POLLED_SUCCESSFULLY=0 AND EM_SCHEDULER_DAILY_POLL.CONTROLLER_ID=30
[22007-199]

Этот SQL отлично работает на SQL-сервере, но дает исключение выше для H2DB. Как решить эту проблему? Мне нужны и дата и время в запросе.

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

Попробуйте использовать литералы даты ISO:

WHERE
    EM_SCHEDULER_DAILY_POLL.DATE_TIME >= '2019-06-26' AND
    EM_SCHEDULER_DAILY_POLL.DATE_TIME < '2019-06-27'

Обратите внимание, что, поскольку вы просто ищете записи за одну дату, вы также можете попробовать привести столбец к дате и выполнить одно сравнение:

WHERE CAST(EM_SCHEDULER_DAILY_POLL.DATE_TIME AS DATE) = '2019-06-26'

В качестве другого комментария, первая версия, которую я дал, с двумя неравенствами, имеет смысл: это означает, что база данных должна иметь возможность использовать индекс для столбца DATE_TIME, в то время как вторая версия, используя приведение кдата, вероятно, не может использовать индекс.Поэтому первая версия является предпочтительным способом, если вам когда-либо понадобится настроить или оптимизировать базу данных.

1 голос
/ 26 июня 2019

Вы передаете значение со временем, но H2 Дата не имеет его. Просто уберите время в вашей второй константе.

'26-Jun-2019 23:59:59' --> '26-Jun-2019'

ДАТА Тип данных даты. Формат: гггг-мм-дд.

Отображается в java.sql.Date со временем, установленным на 00:00:00 (или на следующий возможное время, если полночь не существует для данной даты и часовой пояс из-за изменения летнего времени). java.time.LocalDate также поддерживается в Java 8 и более поздних версиях.

Пример:

ДАТА

Источник: Тип данных H2 .

А так как вы просто хотите один день (по крайней мере, в этом примере), вы можете просто использовать:

DATE_TIME = '26-Jun-2019'

Обратите внимание, что Ответ Тима Бигелайзена о ISO тоже нужно проверить, этот формат не самый лучший

...