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 位。
我认为没有办法让 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)