首页 > 解决方案 > 插入时间戳时的 H2 org.h2.jdbc.JdbcSQLSyntaxErrorException

问题描述

比较时间戳的 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 文档使用类似的时间戳

标签: javamysqltimestamph2

解决方案


尝试正确转换日期字符串

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

推荐阅读