【问题标题】:Function "DATE" not found; SQL statement:未找到函数“日期”; SQL 语句:
【发布时间】:2014-07-01 09:11:13
【问题描述】:

当我为我的 web 项目使用 MySql 数据库时,如果我运行查询 SELECT Date(now()) 会给我当前日期。 最近在运行一些单元测试时,我决定使用内存中的H2 database 以获得更好的性能。现在如果我使用查询SELECT Date(now()),它会给我以下错误

org.h2.jdbc.JdbcSQLException: Function "DATE" not found; SQL statement:
SELECT Date(now()) [90022-178]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
    at org.h2.message.DbException.get(DbException.java:178)
    at org.h2.message.DbException.get(DbException.java:154)
    at org.h2.command.Parser.readJavaFunction(Parser.java:2326)
    at org.h2.command.Parser.readFunction(Parser.java:2378)
    at org.h2.command.Parser.readTerm(Parser.java:2712)
    at org.h2.command.Parser.readFactor(Parser.java:2244)
    at org.h2.command.Parser.readSum(Parser.java:2231)
    at org.h2.command.Parser.readConcat(Parser.java:2201)

那么如何在H2数据库中使用MySql函数

【问题讨论】:

    标签: java mysql h2


    【解决方案1】:

    对于 H2,您需要使用 CURRENT_DATE 函数而不是您正在使用的函数。

    CURRENT_DATE

    正如其他人所指出的,有标准 SQL 和一些扩展(在不同的 RDBMS 提供程序/供应商中是不同的)。 CURRENT_DATE 是标准的一部分,DATE 函数不是。所以只要使用标准函数,你就可以同时使用 H2 和 MySQL。

    【讨论】:

    • 在这种情况下,我需要在不改变大量代码的情况下大量更改我的代码,是否有任何替代方案?
    • @M.Sharma MySQL 本身也是supports CURRENT_DATE,而且它在 SQL 标准中,最好修复一次,而不是继续忍受遗留的不兼容性
    • 如果我想使用 Date() 而不是其他方法,还有其他方法吗
    • 不,H2 没有DATE 功能。如果您想要在多个数据库中工作的代码,最好只使用 ANSI SQL。
    • H2 允许您使用 CREATE ALIAS 语法创建用户定义的函数并提供您自己的 Java 实现。
    【解决方案2】:

    不幸的是,这是您在交换数据库时遇到的那种困难。尽管 JDBC 和大多数 SQL 语句将兼容,但您将无法使用因数据库供应商而异的内置函数。

    有一些方法可以解决这个问题:

    1. 将所有 SQL 语句放入属性文件等外部资源中,并让单元测试加载不同的资源。这样,生产代码将看到 MySQL 语句,而单元测试代码将看到 H2 语句。

    2. 只需使用 MySQL。不要担心性能,单元测试不是性能关键。使用DBUnit等框架

    3. 在单元测试中根本不涉及数据库。由于 JDBC 本身并未在测试中,您可以假设它可以工作,而是使用诸如 Mockito 之类的框架对其进行模拟

    【讨论】:

      【解决方案3】:

      您应该在 MySQL compatibility mode(= MySQL 方言)中运行 H2,而不更改您当前的 SQL 查询。

      编辑

      那么如何在H2数据库中使用MySql函数

      至于DATE()函数的支持,你可以使用CREATE ALIAS并提供你自己的实现。阅读User-Defined Functions and Stored Procedures 下的示例,它非常简单。

      在 H2 讨论板上也有关于此主题的 this old thread,并实现了 MySQL date functions,但请阅读该主题以了解如何使用它们。

      【讨论】:

      • 兼容模式不支持内置功能
      猜你喜欢
      • 2019-08-09
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      相关资源
      最近更新 更多