Microsoft JDBC和Datetime2 - 舍入问题

时间:2017-03-29 09:45:02

标签: java sql-server jdbc mssql-jdbc

从我们的应用程序中,我们创建一个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

2 个答案:

答案 0 :(得分:1)

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

这样的效用函数
private static Timestamp truncatedTimestamp(Timestamp ts, int precision) {
    return Timestamp.valueOf(ts.toString().substring(0, precision + 20));
}

截断指定Timestamp的{​​{1}}值(在您的情况下为6)。

答案 1 :(得分:-1)

MSSQL字符长度最小为19位且最大为23位的问题 因为它将它四舍五入到最多23个字符 就是这种情况