如何修复无法解析 H2 数据库中"DATE"常量问题?



我正在移植用于aix unix Windows的Java应用程序。在Windows上,它使用SQL Server进行配置。在AIX上,我们正在尝试使用H2数据库。大多数代码都可以使用,但是在执行具有DateTime标准的查询时,我会遇到以下错误。

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上给出了以上例外。如何解决这个问题?我需要查询日期和时间。

尝试使用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列上使用索引,而第二版则使用迄今为止的铸件可能无法使用索引。因此,如果您需要调整或优化数据库,则第一个版本是首选的方法。

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

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

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

映射到java.sql.date,将时间设置为00:00:00(或下一个 如果给定日期不存在午夜,可能的时间 由于日光节省的变化,时区。Java.Time.Localdate也是 在Java 8和更高版本上支持

示例:

日期

来源:H2的数据类型。

并且由于您只想要一天(至少在该示例中(,因此您可以简单地使用:

DATE_TIME = '26-Jun-2019'

请注意,蒂姆·比格莱森(Tim Biegeleisen(关于ISO的答案也应该检查,此格式不是最好的

使用to_date函数

示例 - to_date('01 -12-2019','dd-mm-yyyy'(

插入学生(id,name,dob(值(1,'abc',to_date('01 -12-2019','dd-mm-yyyy'((

有一个转换器PARSEDATETIME() FUCTION。

例如,如果日期为12/03/2013,我们需要转换为PARSEDATETIME('12/03/2013','dd/MM/yyyy'),请检查此信息。

SQL语句看起来像Insert into invoice(id, invoice_date) values(1, PARSEDATETIME('12/03/2013','dd/MM/yyyy'))

最新更新