我们正在开发一个多数据库应用程序(对多个数据库进行读写)。数据库上的数据模型是相同的。
我们在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结果: 2017-03-28 14:00:59.410649预期: 2017-03-28 14:00:59.410648
DB2通过丢弃第7位分数来提供预期的结果。
如何使MSSQL不舍入datetime2值?
编辑
应用程序将具有12个分数位的java.sql.Timestamp对象写入DB2和MSSQL。在DB2中,列是时间戳(6),在MSSQL中是DATETIME2(6)。DB2将从12位分数位截断到6位。
发布于 2017-04-05 18:29:37
我认为没有一种方法可以使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发布于 2017-04-06 20:45:59
您可以使用简单的铸造方法来实现这一点。
DECLARE @dt AS Datetime2
SET @dt = CAST('2017-03-28 14:00:59.4106489' AS DATETIME2)
DECLARE @t TABLE(x DATETIME2(6))
INSERT @t SELECT CAST(LEFT(@dt,LEN(@dt) - 1) AS DATETIME2(6))
SELECT x FROM @t
--Result: 2017-03-28 14:00:59.410648如果不修剪最后一个数字,就不能做到这一点。
https://dba.stackexchange.com/questions/169175
复制相似问题