如何解决无法解析H2数据库中的“ DATE”常量问题?

时间:2019-06-26 05:08:45

标签: java sql jdbc h2

我正在将为Windows开发的Java应用程序移植到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 Server上可以完美运行,但在H2DB上具有上述例外。如何解决这个问题?查询中需要日期和时间。

3 个答案:

答案 0 :(得分:2)

尝试使用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 :(得分:1)

您正在传递带有时间的值,但是H2日期只有一个值。 只需删除第二个常量中的时间即可。

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

DATE日期数据类型。格式为yyyy-MM-dd。

     

映射到java.sql.Date,时间设置为00:00:00(或下一个   如果在给定的日期不存在午夜,则可能的时间是   时区(由于夏令时更改)。 java.time.LocalDate也是   在Java 8和更高版本上受支持。

     

示例:

     

日期

来源:Data type of H2

由于只需要一天(至少在该示例中是这样),因此您可以简单地使用:

DATE_TIME = '26-Jun-2019'

请注意,也应检查有关ISO的Tim Biegeleisen's answer,这种格式不是最好的

答案 2 :(得分:0)

使用TO_DATE函数

示例-TO_DATE('01 -12-2019','dd-MM-yyyy')

插入student(Id,Name,DOB)值(1,'Abc',TO_DATE('01 -12-2019','dd-MM-yyyy'))