【问题标题】:Function "TO_DATE" not found in H2 database在 H2 数据库中找不到函数“TO_DATE”
【发布时间】:2014-02-27 22:16:29
【问题描述】:

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

【问题讨论】:

  • 我正在使用 java.util.Date()

标签: java sql h2 to-date


【解决方案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()

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      【解决方案4】:

      H2 暂不支持 to_date 函数。

      这是路线图中的优先级 2 元素

      http://www.h2database.com/html/roadmap.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-20
        • 2011-08-11
        • 2016-06-08
        • 2019-01-18
        • 1970-01-01
        • 2014-01-20
        • 2022-11-18
        • 2018-06-13
        相关资源
        最近更新 更多