0

我想从 HSQL 数据库中获取记录,查询如下:

ao.find(Issueda.class, Query.select().where("user=? AND TO_DATE(START_TIME, 'yyyy/MM/dd')>=     TO_DATE(?,'yyyy/MM/dd') AND TO_DATE(END_TIME, 'yyyy/MM/dd') <= TO_DATE(?,'yyyy/MM/dd')",user,parsedDate,parsedDate))

现在,它给了我一个错误,“To_DATE”不是有效的关键字,如下所示:

at java.lang.Thread.run(Thread.java:662)
 Caused by: java.sql.SQLException: Unexpected token: TO_DATE in statement [SELECT * FROM    
PUBLIC.AO_0371A8_ISSUE_da WHERE user=? AND TO_DATE(START_TIME, 'yyyy/MM/dd')>= TO_DATE(?,'yyyy/MM/dd') AND    TO_DATE(END_TIME, 'yyyy/MM/dd') <= TO_DATE(?,'yyyy/MM/dd')]

如果我删除“To_date”,那么即使数据库中存在数据,我也不会从数据中获取正确的结果数据并且仅返回 null。数据库中日期字段值的格式为“2013-05-15 00:00:00.000000000”

任何人都可以分享我查询数据库的任何替代方法吗?

4

1 回答 1

1

此查询不需要 TO_DATE。TO_DATE 用于转换字符串格式的日期。

从您的评论看来,您希望一个参数位于两个日期之间或两个日期之外。

此类查询的正确 SQL 如下所示:

这将返回开始和结束之间的日期,包括:

WHERE USER=? AND ? BETWEEN CAST(START_TIME AS DATE) AND CAST(END_TIME AS DATE)

这将返回开始和结束之外的日期:

WHERE USER=? AND ? NOT BETWEEN CAST(START_TIME AS DATE) AND CAST(END_TIME AS DATE)

对于上述查询,您使用 java.sql.Data 对象PreparedStatement.setDate(colIndex)

现在,如果您要比较的日期是格式为“2013/05/20”的字符串,那么您需要TO_DATE(?,'yyyy/MM/dd')代替参数。如果日期是标准格式的字符串,例如“2013-05-20”,则可以使用CAST(? AS DATE)该参数代替。

我假设您的数据库表列 START_TIME 和 END_TIME 被定义为 TIMESTAMP 类型,但它应该适用于 VARCHAR(N) 或 CHAR(N) 类型。

于 2013-05-07T15:42:17.687 回答