Datetime2 舍入问题

Kel*_*yne 6 sql-server datetime2

我们正在开发一个多数据库应用程序(读取和写入多个数据库)。数据库上的数据模型是相同的。

我们在 MSSQL 的 datetime2(6) 列中插入一个时间戳(12 个小数位)值,但是 MSSQL 对该值进行舍入,使其与忽略额外小数位的其他数据库不同。

例子:

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

结果:2017-03-28 14:00:59.41064 9 预期:2017-03-28 14:00:59.41064 8

DB2 通过丢弃第 7 个小数位来提供预期结果。

我们怎样才能让MSSQL不舍入datetime2值?

编辑

该应用程序将具有 12 个小数位的 java.sql.Timestamp 对象写入 DB2 和 MSSQL。在 DB2 中,该列是 TIMESTAMP(6),在 MSSQL 中是 DATETIME2(6)。DB2 从 12 位小数位截断为 6 位。MSSQL 向下舍入为 6 位。

ype*_*eᵀᴹ 2

我认为没有办法让 SQL Server 默认截断传入值而不是舍入。

但是,您可以在将值发送到数据库之前控制 Java 应用程序中的值。

根据Java 8 文档,您可以使用java.sql.Timestamp以下方法getNanos()setNanos()方法(伪代码,我的 Java 生锈了):

ts = ...                  // the Timestamp object

micros = ts.getNanos() / 1000 ;   // extract and truncate to microseconds
ts.setNanos( micros * 1000 ) ;    // set the truncated value back

insert(..., ts, ...) ;    // INSERT
Run Code Online (Sandbox Code Playgroud)