H2数据库中找不到"TO_DATE"功能

use*_*428 7 java sql h2 to-date

我有一个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')) 
Run Code Online (Sandbox Code Playgroud)

用Id替换第一个参数,用新的Date()值替换第二个和第三个参数.

Exception:
Caused by: org.h2.jdbc.JdbcSQLException: Function "TO_DATE" not found; SQL statement:
Run Code Online (Sandbox Code Playgroud)

Eoi*_*inS 15

你应该能够创建自己的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); 
} 
' 
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

PARSEDATETIME(FORMATDATETIME(field_name, 'yyyy-MM-dd'), 'yyyy-MM-dd')
Run Code Online (Sandbox Code Playgroud)

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

是的,它不是超级优化的。这非常适合我们的需求,因为我们只使用 H2 进行单元测试。


Tij*_*ese 2

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