我正在移植用于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'))