我正在将为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上具有上述例外。如何解决这个问题?查询中需要日期和时间。
答案 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'))