【问题标题】:Microsoft JDBC and Datetime2 - rounding issueMicrosoft JDBC 和 Datetime2 - 舍入问题
【发布时间】:2017-03-29 09:45:02
【问题描述】:

从我们的应用程序中,我们创建一个 java.sql.Timestamp,如下所示:

Timestamp currentTimeStamp = new Timestamp(System.currentTimeMillis());
currentTimeStamp.setNanos((int) (System.nanoTime() % 1000000000));

然后将其用作针对 DB2 和 MSSQL 的分布式事务中的列值。

DB2 删除它不能使用的数字并存储剩余的数字。

MSSQL 将数字四舍五入并存储该值。

然后问题就变成了两个数据库中的时间戳值不同,即使它们都具有相同的小数位 6。

使用纯 T-SQL 复制的示例:

DECLARE @t TABLE(x DATETIME2(6)) 
INSERT @t SELECT '2017-03-28 14:00:59.4106489'
SELECT x FROM @t

结果: 2017-03-28 14:00:59.410649

预期: 2017-03-28 14:00:59.410648

【问题讨论】:

    标签: java sql-server jdbc mssql-jdbc


    【解决方案1】:

    听起来您需要创建一个 SQL Server 不会舍入的 Timestamp 值,从而确保两个数据库中的值相同。一种方法是使用实​​用函数,例如

    private static Timestamp truncatedTimestamp(Timestamp ts, int precision) {
        return Timestamp.valueOf(ts.toString().substring(0, precision + 20));
    }
    

    在指定的precision 处截断Timestamp 值(在您的情况下为6)。

    【讨论】:

    • 我已经想到了,但是基于开发人员,它很容易出错。我宁愿确保数据库正确处理这个问题,也不愿告诉一个由 20 名开发人员组成的团队在写入 datetime2(x) 列时记住使用 X 精度。这也允许 DBA 和开发人员角色保持分离。此外,AFAIK 大部分数据库不会对值进行舍入,而是对其进行修整或抛出错误。
    【解决方案2】:

    MSSQL字符长度最小19到最大23的问题 因为它四舍五入到最多 23 个字符 是这样的

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 2014-08-04
    • 2013-04-12
    • 2011-08-23
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多