如何解决 H2 数据库中无法解析 "DATE" 常量问题?
How to fix Cannot parse "DATE" constant issue in H2 Database?
我正在将为 Windows 开发的 Java 应用程序移植到 AIX Unix。在 Windows 上,它使用 SQL 服务器进行配置。在 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 服务器上完美运行,但在 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 Date 没有。
只需删除第二个常量中的时间。
'26-Jun-2019 23:59:59' --> '26-Jun-2019'
DATE The date data type. The format is yyyy-MM-dd.
Mapped to java.sql.Date, with the time set to 00:00:00 (or to the next
possible time if midnight doesn't exist for the given date and
timezone due to a daylight saving change). java.time.LocalDate is also
supported on Java 8 and later versions.
Example:
DATE
来源:Data type of H2.
因为你只想要一天(至少在那个例子中),你可以简单地使用:
DATE_TIME = '26-Jun-2019'
注意关于ISO也要检查,这种格式不是最好的
使用TO_DATE函数
示例 - TO_DATE('01-12-2019','dd-MM-yyyy')
插入 student(Id,Name,DOB) values(1, 'Abc', TO_DATE('01-12-2019','dd-MM-yyyy'))
我正在将为 Windows 开发的 Java 应用程序移植到 AIX Unix。在 Windows 上,它使用 SQL 服务器进行配置。在 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 服务器上完美运行,但在 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 Date 没有。 只需删除第二个常量中的时间。
'26-Jun-2019 23:59:59' --> '26-Jun-2019'
DATE The date data type. The format is yyyy-MM-dd.
Mapped to java.sql.Date, with the time set to 00:00:00 (or to the next possible time if midnight doesn't exist for the given date and timezone due to a daylight saving change). java.time.LocalDate is also supported on Java 8 and later versions.
Example:
DATE
来源:Data type of H2.
因为你只想要一天(至少在那个例子中),你可以简单地使用:
DATE_TIME = '26-Jun-2019'
注意
使用TO_DATE函数
示例 - TO_DATE('01-12-2019','dd-MM-yyyy')
插入 student(Id,Name,DOB) values(1, 'Abc', TO_DATE('01-12-2019','dd-MM-yyyy'))