java - 尝试(但失败)为 H2 数据库创建用户函数

标签 java mysql h2

我们的主要数据库是MySQL。

很少有查询使用相当常见的DATE_SUB($date, INTERVAL $duration $type)

我们正在 H2 数据库上运行测试,缺少 DATE_SUB() 函数会产生问题。
我们有一个想法,创建一个用户 H2 函数来复制 MySQL 行为 - 我对此进行了两次单独的尝试,两种实现都存在并且分别映射。

    CREATE ALIAS IF NOT EXISTS DATE_SUB FOR "xxx.yyy.Zzz.dateSubtract";

public Zzz {
        ...
        public static Date dateSubtract(Connection connection, String dateValue, String formula) {
            return dateSubtractJava(dateValue, formula);
        }

        public static Date dateSubtract(Connection connection, String dateValue, String INTERVAL, String numberOfDateIntervals, String dateIntervalName) {
            return dateSubtractJava(dateValue, INTERVAL, numberOfDateIntervals, dateIntervalName);
        }
        ...
}

不幸的是我的尝试失败了:

org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement 
...  
DATE_SUB(?, INTERVAL 1[*] DAY)  
expected "., (, [, ::, *, /, %, +, -, ||, ~, !~, NOT, LIKE, REGEXP, IS, IN, BETWEEN, AND, OR, ), ,";

看起来 H2 甚至没有尝试使用我的用户函数,但在尝试解析 SQL 语句时失败了。

有人成功地做过类似的事情吗?

最佳答案

供将来引用,直到 H2 决定添加对 INTERVAL 数据类型的支持(它在他们的待办事项列表中)

目前看来唯一的选择是使用替代功能:
此时此刻

TIMESTAMPADD(unquotedPeriodName, -1, :date)

提供非常相似的功能,所以这就是我将使用的功能。

关于java - 尝试(但失败)为 H2 数据库创建用户函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34003424/

相关文章:

java - 运算符 * 未定义参数类型 double, Point2D.Double

java - Hibernate 5.x 迁移建议脚本

java - 如何使用 Java 中的 Quartz Scheduler 框架运行 cron 作业?

java - 嵌入式 H2 + Tomcat 7 JDBC 领域 + Hibernate = "Locked by another process"

java - 如何设置 Android Studio 中安装的默认项目?

C# 转换错误 (DataRow)

PHP 析构函数显示错误?

mysql - artisan - SQLSTATE [HY000] [2003] 无法连接到 '127.0.0.1' 上的 MySQL 服务器

spring - 修改实体后,jhipster liquibase验证错误

spring-boot - 使用生成的 JOOQ 代码针对多种数据库类型