无法查询特定范围内的日期条件

时间:2013-05-06 11:54:25

标签: java jira hsqldb active-objects

我想从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”

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

1 个答案:

答案 0 :(得分:1)

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

从您的评论中可以看出,您希望一个参数位于两个日期之间,或者在两个日期之外。

此类查询的正确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)

对于上述查询,您使用带有PreparedStatement.setDate(colIndex)

的java.sql.Data对象

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

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