2017-03-29 13 views
0

を丸め:マイクロソフトJDBCおよびDATETIME2 - 私たちはこのようたjava.sql.Timestampを作成し、当社のアプリケーションから問題

Timestamp currentTimeStamp = new Timestamp(System.currentTimeMillis()); 
currentTimeStamp.setNanos((int) (System.nanoTime() % 1000000000)); 

そしてDB2とMSSQLに対して分散トランザクションに列の値として使用します。

DB2は使用できない桁を取り除き、残りの部分を保管します。

MSSQLは数字を四捨五入して値を格納します。

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

の検索結果を:

問題は、彼らの両方が6

例の同じ割合の数字は、純粋なT-SQLを使用して再現しているにもかかわらず、二つのデータベースにタイムスタンプ値が異なることになり59.410649期待

::: 2017年3月28日14:00 2017年3月28日14:00:59.410648

+1

あなたの期待は間違っています。分数秒を切り捨てたい場合は、それをJDBCドライバに渡す前に行う必要があります。 –

答えて

-1

MSSQL文字の長さがあるため、それは最大23文字 これにあると、それを丸めていることの23最大 に19箇所の最小値である問題は、あなたは、SQL Serverが勝ったことTimestamp値を作成する必要があるようですね場合

+0

申し訳ありませんが、[datetime](https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql)には23文字の最大値が適用されますが、[datetime2] (https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime2-transact-sql)。 –

0

です両方のデータベースで値が同じになるようにします。一つのアプローチは、(あなたのケースでは、6)指定されたprecisionTimestamp値を切り捨てる

private static Timestamp truncatedTimestamp(Timestamp ts, int precision) { 
    return Timestamp.valueOf(ts.toString().substring(0, precision + 20)); 
} 

のようなユーティリティ関数を使用することです。

+0

私はそれを考えましたが、それは開発者に基づいて非常に間違いやすいです。 私はdatetime2(x)列に書き込むときにX精度を使用することを忘れないように、20人の開発者からなるチームに指示するよりも、データベースがこれを正しく処理するようにしたいと思います。これにより、DBAと開発者ロールを分割したままにすることもできます。 また、AFAIKのほとんどのデータベースでは値が丸められず、代わりにトリミングまたはエラーが発生します。 –

関連する問題