未找到函数“日期”; 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 本身也是supports CURRENT_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 语句:的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL中SQL语句怎样转换日期型函数为字符型?

编辑sql语句时,年月日型时间字段如何表达

SQL 日期函数问题;我想写一个查询语句,是查表中日期字段后十天的数据

SQL日期时间函数

sql语句中日期时间类型怎么比较

SQL语句自动获取本机日期时间