未找到函数“日期”; SQL 语句:
Posted
技术标签:
【中文标题】未找到函数“日期”; SQL 语句:【英文标题】:Function "DATE" not found; SQL statement: 【发布时间】: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函数
【问题讨论】:
【参考方案1】:对于 H2,您需要使用 CURRENT_DATE
函数而不是您正在使用的函数。
CURRENT_DATE
正如其他人所指出的,有标准 SQL 和一些扩展(在不同的 RDBMS 提供程序/供应商中是不同的)。 CURRENT_DATE
是标准的一部分,DATE
函数不是。所以只要使用标准函数,你就可以同时使用 H2 和 MySQL。
【讨论】:
在这种情况下,我需要在不改变大量代码的情况下大量更改我的代码,是否有任何替代方案? @M.Sharma MySQL 本身也是supportsCURRENT_DATE
,而且它在 SQL 标准中,最好修复一次,而不是继续忍受遗留的不兼容性
如果我想使用 Date() 而不是其他方法,还有其他方法吗
不,H2 没有DATE
功能。如果您想要在多个数据库中工作的代码,最好只使用 ANSI SQL。
H2 允许您使用 CREATE ALIAS
语法创建用户定义的函数并提供您自己的 Java 实现。【参考方案2】:
不幸的是,这是您在交换数据库时遇到的那种困难。尽管 JDBC 和大多数 SQL 语句将兼容,但您将无法使用因数据库供应商而异的内置函数。
有一些方法可以解决这个问题:
将所有 SQL 语句放入属性文件等外部资源中,并让单元测试加载不同的资源。这样,生产代码将看到 MySQL 语句,而单元测试代码将看到 H2 语句。
只需使用 MySQL。不要担心性能,单元测试不是性能关键。使用DBUnit等框架
在单元测试中根本不涉及数据库。由于 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,但请阅读该主题以了解如何使用它们。
【讨论】:
兼容模式不支持内置功能以上是关于未找到函数“日期”; SQL 语句:的主要内容,如果未能解决你的问题,请参考以下文章