org.h2.jdbc.JdbcSQLException:未知数据类型:“DATEADD”; SQL 语句

Posted

技术标签:

【中文标题】org.h2.jdbc.JdbcSQLException:未知数据类型:“DATEADD”; SQL 语句【英文标题】:org.h2.jdbc.JdbcSQLException: Unknown data type: "DATEADD"; SQL statement 【发布时间】:2020-04-13 18:52:32 【问题描述】:

我在运行时和测试期间使用 h2 注入数据库,一切正常,直到我开始尝试使日期字段成为当前字段,而不是硬编码。 我认为这与我所使用的 jdbc 版本有关,并将 spring jdbc 库更新为最新的,但这并没有解决问题。

这是我用来在运行时和测试时注入数据的代码:

此代码在运行时运行,在我尝试将日期设为当前日期之前它运行良好。

        ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
        resourceDatabasePopulator.addScript(new ClassPathResource("schema.sql"));
        resourceDatabasePopulator.addScript(new ClassPathResource("data.sql"));
        DatabasePopulatorUtils.execute(resourceDatabasePopulator, dataSource); // This is what the DataSourceInitializer does.


出于测试目的,我正在使用此代码,正如我所提到的,在我尝试将日期设为当前日期之前它运行良好。

        DataSource dataSource = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)
                .addScript("classpath:schema.sql")
                .addScript("classpath:data.sql")
                .build();

data.sql 文件

INSERT INTO  TABLE_X (
  dayxx,
  xxx
) VALUES
(CONVERT(char(50), DATEADD('DAY', -1,CURRENT_DATE()),126),'xxx')


例外

Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Unknown data type: "DATEADD"; SQL statement:
INSERT INTO TABLE_X ( dayxx, xxx ) VALUES (CONVERT(char(50), DATEADD('DAY', -1,CURRENT_DATE()),126),'XXX') [50004-200]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:505)
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
    at org.h2.message.DbException.get(DbException.java:205)
    at org.h2.message.DbException.get(DbException.java:181)
    at org.h2.command.Parser.parseColumnWithType(Parser.java:5971)
    at org.h2.command.Parser.readFunctionParameters(Parser.java:3793)
    at org.h2.command.Parser.readFunction(Parser.java:3772)
    at org.h2.command.Parser.readTerm(Parser.java:4305)
    at org.h2.command.Parser.readFactor(Parser.java:3343)
    at org.h2.command.Parser.readSum(Parser.java:3330)
    at org.h2.command.Parser.readConcat(Parser.java:3305)
    at org.h2.command.Parser.readCondition(Parser.java:3108)
    at org.h2.command.Parser.readExpression(Parser.java:3059)
    at org.h2.command.Parser.parseValuesForCommand(Parser.java:1877)
    at org.h2.command.Parser.parseInsertGivenTable(Parser.java:1817)
    at org.h2.command.Parser.parseInsert(Parser.java:1749)
    at org.h2.command.Parser.parsePrepared(Parser.java:954)
    at org.h2.command.Parser.parse(Parser.java:843)
    at org.h2.command.Parser.parse(Parser.java:815)
    at org.h2.command.Parser.prepareCommand(Parser.java:738)
    at org.h2.engine.Session.prepareLocal(Session.java:657)
    at org.h2.engine.Session.prepareCommand(Session.java:595)
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1235)
    at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:212)
    at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:201)
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:472)
    ... 53 more



【问题讨论】:

this不是转换函数(值、数据类型)的语法吗? 这不是问题,Matteo 您正在使用 SQL Server 的 CONVERT 语法。正如 Matteo 所评论的,H2 的 CONVERT 语法是不同的。这解释了错误。 H2 期望 CONVERT 的第二个参数是一种数据类型。 DATEADD 不是数据类型。 【参考方案1】:

如docs 中所述,转换函数如下所示:

转换(值,数据类型)

将值转换为另一种数据类型。

例子:

转换(名称,INT)

既然你过去了

CONVERT(char(50), DATEADD('DAY', -1,CURRENT_DATE()),126)

错误表明 DATEADD 不是有效的数据类型,因为它是值,而不是类型,因此请尝试使用正确的语法。

【讨论】:

感谢 Matteo,但是我如何在不传递 126 值的情况下将日期转换为 YYYY-MM-dd 格式? 你能用this试试吗? 当我添加 TO_CHAR 时效果很好,感谢您的帮助,CONVERT(TO_CHAR(DATEADD('DAY', -1, CURRENT_DATE),'YYYY-MM-dd'),char(50))

以上是关于org.h2.jdbc.JdbcSQLException:未知数据类型:“DATEADD”; SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章