マルチデータベースアプリケーション(複数のデータベースの読み取りと書き込み)に取り組んでいます。データモデルはデータベースで同一です。
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.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 docs によると、_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
_
簡単なキャスト方法でこれを実現できます
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
あなたは最後の桁をトリミングせずにこれを達成することはできません