H2 org.h2.jdbc.JdbcSQLSyntaxErrorException при вставке отметки времени - PullRequest
0 голосов
/ 12 апреля 2019

SQL-запрос, сравнивающий временные метки, работает в MySQL, но не работает при использовании базы данных H2.

Например, это запрос, выдающий исключение:

SELECT * FROM table WHERE time >= '2019-02-01T10:59:12.632Z' AND time <= '2019-04-12T10:59:12.632Z'

Запрос создается динамически с использованием кода Java, а приведенные выше временные метки имеют тип java.time.Instant.

Я даже пытался использовать другие типы объектов даты / времени с тем же результатом.

Этот запрос выполняется нормально с использованием MySQL, но выдает следующую ошибку с использованием базы данных H2:

 org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement 
 "SELECT * FROM table WHERE  time>= 2019-04-10T13[*]:31:19.498Z AND  time <= 2019-04-07T13:31:19.498Z";
 SQL statement: 
 SELECT * FROM table WHERE  time >= 2019-04-10T13:31:19.498Z AND  time<= 2019-04-07T13:31:19.498Z

Мне кажется странным, что использование временных меток, разделенных двоеточиями, вызывает эту проблему, тем более что в документах H2 используются аналогичные временные метки

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Я использую Spring Boot's JdbcTemplate и создаю свои запросы следующим образом:

jdbcTemplate.query("SELECT * FROM table WHERE  time >= " + startTime + " AND " +  " time <= " + endTime, (rs, i) -> Accessor.readFromResultSet(rs));

с датой Строки, переданные как Instant объекты.

Решение, благодаря комментарию @ OleV.V, состояло в том, чтобы передать объекты даты в качестве аргумента Object:

jdbcTemplate.query("SELECT * FROM table WHERE  time >= ? AND time <= ?", new Object[]{startTime, endTime}, (rs, i) -> Accessor.readFromResultSet(rs));
1 голос
/ 12 апреля 2019

попробуйте правильно преобразовать строку даты

SELECT * FROM table WHERE time >= str_to_date('2019-02-01 10:59:12.632 ', '%Y-%m-%d %T.%f') 
      AND time <=  str_to_date( '2019-04-12 10:59:12.632 ' , '%Y-%m-%d %T.%f') 
...