1

SQL Server 2008でTimestampの代わりにtimestamp2を使用しようとすると、問題が発生します。どうやら、rs.getTimestampの動作はtimestampとtimestamp2で大きく異なります。ただし、違いがあるはずだ、または別のものを使用する必要があるというドキュメントが見つかりません。何か間違ったことをしているだけなのかしら。

環境:

  • SQL Express 2008(10.0)とSQL Server 2008 R2(10.5)の両方で試してみました。
  • sqljdbc4.jarバージョン3.0、サイズ537,303バイト、CRC-32 = a0aa1e25、MD5=402130141d5f2cee727f4371e2e8fd8a。
  • Java 1.6

これが問題を示す単体テストです。唯一の「魔法」は「Db.getConnection()」であり、これを適切なコードに置き換えることができます。テストはdatetimeとdatetime2の両方で同じですが、datetime2テストは2日前の日付で失敗します。DBでは常にGMT/UTCとして扱い、datetime2データのデータベースデータにタイムゾーン情報を追加しようとはしていません。

    private void testTimestamp(TimeZone gmtTz, Connection conn, String query,
                    Calendar expectedCal) throws SQLException
    {
            PreparedStatement stmt = conn.prepareStatement(query);
            ResultSet rs = stmt.executeQuery();
            while (rs.next())
            {
                    // Note the expectedCal has a GMT timezone.
                    Date actualTs = rs.getTimestamp("dt", expectedCal);

                    // Just print out the time difference
                    long diff = actualTs.getTime() - expectedCal.getTimeInMillis();
                    System.out.println("Diff=" + diff);

                    // Do the test to make sure they are the same
                    // In practice, this succeeds for datetime and fails for datetime2
                    Assert.assertEquals(expectedCal.getTimeInMillis(), actualTs.getTime());
            }
    }

    @Test
    public void testDateTime() throws SQLException
    {
            Connection conn = Db.getConnection();
            TimeZone gmtTz = TimeZone.getTimeZone("GMT");
            String query;

            Calendar expectedCal = Calendar.getInstance(gmtTz);
            expectedCal.clear();
            expectedCal.set(2011, 10, 02, 11, 17);

            query = "select CAST('2011-11-02 11:17:00' as datetime) as dt";
            testTimestamp(gmtTz, conn, query, expectedCal);

            query = "select CAST('2011-11-02 11:17:00.0000000' as datetime2) as dt";
            testTimestamp(gmtTz, conn, query, expectedCal); // results in an error
    }

タイムスタンプに戻す唯一のオプションはありますか?

編集:将来のGoogle社員のために、sqljdbc4.jarバージョン3.0を使用すると、テストはLinuxでは失敗しますが、Windowsでは合格します。SQLServer2012に付属しているsqljdbc4.jarバージョン4.0はまだ試していません。

4

2 に答える 2

4

MicrosoftJDBC3.0ドライバーでSunJRE1.7を使用している場合は、このブログ投稿http://blogs.msdn.com/b/jdbcteam/archive/2012/01/20/hotfix-available-for-date-issue-whenを参照してください。 -using-jre-1-7.aspx

ドライバーにバグを発見したと思われる場合は、MicrosoftConnectを介して報告できます。 https://connect.microsoft.com/SQLServer

于 2012-04-19T20:31:54.027 に答える
3

公式のSQLServerドライバーとJTDSが優先されていることについて良いことを聞いていなかったことを覚えています(ただし、そのリンクを見つけることができないようです)。私は個人的にJTDSを使用するか(もちろん厳密なテストを行います)、問題が発生しないバージョンに戻します。私はSQLServerを使用したことがありませんが、見た目からすると、これdatetime2が推奨されるデータ型であると思われるため、元に戻さないようにします。オプション(d)は実際には良いオプションIMOではありません。:)

于 2011-11-03T16:22:50.597 に答える