sql - H2 TRUNC 功能缺陷

标签 sql h2

从 1.3.172 版本开始,有一个 TRUNC 函数,它模仿了 Oracle 的 TRUNC(TIMESTAMP)。实现过程中存在一个小问题。查询:

select TRUNC(TIMESTAMP '2000-02-04 11:13:14') from dual;

按预期返回“2000-02-04 00:00:00”,但是:

select TRUNC(TIMESTAMP '2000-02-04 15:13:14') from dual;

返回“2000-02-04 12:00:00”,这是错误的。

原因是实现不正确(从Function.java的1031行开始),我们看到:

case TRUNCATE: {
    if (v0.getType() == Value.TIMESTAMP) {
        java.sql.Timestamp d = v0.getTimestamp();
        Calendar c = Calendar.getInstance();
        c.setTime(d);
        c.set(Calendar.HOUR, 0);
        c.set(Calendar.MINUTE, 0);

c.set(Calendar.HOUR, 0) 应该替换为 c.set(Calendar.HOUR_OF_DAY, 0) --- 否则它会截断 12 -小时时钟(仅在中午之前模仿 oracle 版本)。

是否有希望在不久的将来包含此类修复程序?

我会自己进行修复,但“stackoverflow h2 标签”是我能找到的唯一“支持”链接,所以我就是从那里报告问题的。

与此同时(在我等待修复变得可访问时),是否可以替换(例如,通过删除现有别名并将其替换为不同的实现)?

最佳答案

H2 web site ,“支持”下有3个链接:StackOverflow , Google Group EnglishJapanese .对于错误报告,使用 Google Group 很有意义。

截断时间戳的功能相对较新。您发现的错误已被其他人发现并已修复在主干中。如果需要,您可以自己下载并构建 H2 来尝试一下。

关于sql - H2 TRUNC 功能缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17322905/

相关文章:

java - H2(文件)删除性能

sql - 在 sql 中没有任何 while 循环的情况下从列中删除前导零

sql - 我如何在每个组中只选择最小创建日期的 ID

php - MySQL 在给定时间段内找到前 x%

php - 使用内部连接删除行

java - H2数据库: Get rows from subquery as array

database - H2 数据库 : How to list all views?

java - 从文件流导入 H2 CSV

sql - Postgres : How do I insert from another table and set a foreign key to the row afterwards?

sql - 从 H2(和 DB2)中的三个其他连接表更新一个表中的值