从我们的应用程序中,我们创建一个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
答案 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个字符 就是这种情况