首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Datetime2舍入问题

Datetime2舍入问题
EN

Database Administration用户
提问于 2017-04-05 10:05:05
回答 2查看 2.1K关注 0票数 5

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

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

示例:

代码语言:javascript
复制
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位。

EN

回答 2

Database Administration用户

发布于 2017-04-05 18:29:37

我认为没有一种方法可以使Server默认截断传入值而不是舍入值。

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

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

代码语言:javascript
复制
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
票数 2
EN

Database Administration用户

发布于 2017-04-06 20:45:59

您可以使用简单的铸造方法来实现这一点。

代码语言:javascript
复制
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

如果不修剪最后一个数字,就不能做到这一点。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/169175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档