我有一个SQL语句,并尝试使用Java中的H2内存数据库执行。抛出以下异常。
SQL:
SELECT ACCT_RULE_ID, ACCT_ACTION_ID FROM ACCT_RULE WHERE (ACCT_ACTION_ID = ?) AND (START_DATETIME <= to_char(?, 'mm/dd/yyyy HH:MI:SS AM')) AND (STOP_DATETIME > to_char(?, 'mm/dd/yyyy HH:MI:SS AM'))
用Id替换第一个参数,用新的Date()值替换第二个和第三个参数。
Exception:
Caused by: org.h2.jdbc.JdbcSQLException: Function "TO_DATE" not found; SQL statement:
答案 0 :(得分:2)
H2数据库没有TO_CHAR()函数。但H2数据库确实有sysdate,dual,varchar2,这使得编写将在H2数据库上运行的oracle查询非常容易。因此,您可以编写一个函数来代替H2数据库函数别名,以使其处理格式的日期/时间戳。 TO_CHAR(sysdate, 'DD/MM/YYYY HH24:MI:SS')
可以在H2数据库中使用。
答案 1 :(得分:2)
从H2中的日期时间字段中删除时间部分的一种方法是将字段格式化为字符串然后解析。这对我有用。
PARSEDATETIME(FORMATDATETIME(field_name,&#39; yyyy-MM-dd&#39;),&#39; yyyy-MM-dd&#39;)
H2的解析和格式化日期函数遵循java.text.SimpleDataFormat语义。
是的,它不是超级优化的。这对我们的需求很好,因为我们只使用H2进行单元测试。
答案 2 :(得分:1)
答案 3 :(得分:1)
您应该能够创建自己的to_date
函数
drop ALIAS if exists TO_DATE;
CREATE ALIAS TO_DATE as '
import java.text.*;
@CODE
java.util.Date toDate(String s, String dateFormat) throws Exception {
return new SimpleDateFormat(dateFormat).parse(s);
}
'
当然,您也可以根据David Small的回答使用parsedatetime()