我想从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”
任何人都可以与我分享查询数据库的任何替代方法吗?
答案 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)
现在,如果要比较的日期是格式为“2013/05/20”的字符串,那么您需要TO_DATE(?,'yyyy/MM/dd')
而不是参数。如果日期是标准格式的字符串,例如“2013-05-20”,那么您可以使用CAST(? AS DATE)
代替参数。
我假设您的数据库表列START_TIME和END_TIME定义为TIMESTAMP类型,但它应该适用于VARCHAR(N)或CHAR(N)类型。