7

我有一条 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:
4

4 回答 4

4

从 H2 中的日期时间字段中删除时间部分的一种方法是将字段格式化为字符串,然后解析。这对我有用。

PARSEDATETIME(FORMATDATETIME(field_name, 'yyyy-MM-dd'), 'yyyy-MM-dd')

H2 的解析和格式化日期函数遵循 java.text.SimpleDataFormat 语义。

是的,它不是超级优化的。这对我们的需求很好,因为我们只使用 H2 进行单元测试。

于 2016-03-25T14:23:55.713 回答
4

您应该能够创建自己的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); 
} 
' 

当然,您也可以parsedatetime()按照 David Small 的回答使用

于 2018-12-19T19:40:55.617 回答
2

H2 数据库没有 TO_CHAR() 函数。但是 H2 数据库确实有 sysdate、dual、varchar2,这使得编写将在 H2 数据库上运行的 oracle 查询非常容易。因此,您可以编写一个函数来代替 H2 数据库函数别名,以使其处理具有格式的日期/时间戳。TO_CHAR(sysdate, 'DD/MM/YYYY HH24:MI:SS')可以在H2数据库中使用。

于 2014-02-04T05:04:42.173 回答
1

尽管缺乏文档,但自 2.0.204 起 PostgreSQL 兼容模式中仍有 TO_DATE 函数。

变更日志

于 2015-10-28T16:08:59.780 回答