插入时间戳记时,H2 org.h2.jdbc.JdbcSQLSyntaxErrorException

时间:2019-04-12 13:44:12

标签: java mysql timestamp h2

比较时间戳的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 DB会引发以下错误:

 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 docs use similar timestamps

2 个答案:

答案 0 :(得分:1)

尝试正确转换日期字符串

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') 

答案 1 :(得分:1)

我正在使用Spring Boot的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));