功能“DATE”未找到; SQL语句:

时间:2014-07-01 09:11:13

标签: java mysql h2

当我使用MySql数据库作为我的webproject时,如果我运行查询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函数

3 个答案:

答案 0 :(得分:3)

使用H2,您需要使用CURRENT_DATE功能而不是您正在使用的功能。

CURRENT_DATE

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

答案 1 :(得分:0)

不幸的是,这在交换数据库时遇到了一些困难。尽管JDBC和大多数SQL语句是兼容的,但是在内置函数之间存在问题,这些函数因数据库供应商而异。

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

  1. 将所有SQL语句放入外部资源(如属性文件)中,并使单元测试加载不同的资源。这样生产代码将看到My​​SQL语句和单元测试代码将看到H2语句。

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

  3. 等框架
  4. 在单元测试中根本不涉及数据库。由于JDBC本身没有经过测试,你可以假设它有效,而不是用Mockito

  5. 这样的框架来模拟它。

答案 2 :(得分:0)

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

修改

  

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

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

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