【发布时间】:2019-04-12 13:44:11
【问题描述】:
比较时间戳的 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
【问题讨论】:
-
与其动态构建查询字符串,不如使用准备好的语句并将瞬间作为查询参数传递。
-
@OleV.V.这是正确的解决方案。我正在使用 Spring Boot,所以我只是将两个 Instants 作为参数传递给
jdbcTemplate.query()方法。谢谢。 -
@OleV.V.我已经这样做了:)