Como o timestamp2 do SQL Server deve funcionar no JDBC?

Estou com problemas para tentar usar o timestamp2 em vez do timestamp no SQL Server 2008. Aparentemente, rs.getTimestamp tem um comportamento muito diferente entre timestamp e timestamp2. No entanto, não consigo encontrar nenhuma documentação afirmando que deve haver uma diferença ou que devo usar algo diferente. Gostaria de saber se estou apenas fazendo algo errad

Meio Ambiente

Tentei no SQL Express 2008 (10.0) e no SQL Server 2008 R2 (10.5 sqljdbc4.jar versão 3.0, tamanho de 537.303 bytes, CRC-32 = a0aa1e25, MD5 = 402130141d5f2cee727f4371e2e8fd8Java 1.6

Aqui está um teste de unidade demonstrando o problema. A única "mágica" é o "Db.getConnection ()", que você pode substituir pelo código apropriado. O teste é o mesmo para datetime e datetime2, mas o teste datetime2 falha com uma data 2 dias antes. Trato todas as vezes no banco de dados como GMT / UTC e não tentei adicionar informações de fuso horário nos dados do banco de dados para dados datetime

    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
    }

minha única opção é voltar ao carimbo de data e hor

EDIT: para futuros googlers, usando o sqljdbc4.jar versão 3.0, o teste falha no Linux, mas passa no Windows. Ainda não experimentei o sqljdbc4.jar versão 4.0 que acompanha o SQL Server 2012.

questionAnswers(2)

yourAnswerToTheQuestion