¿Cómo se supone que la marca de tiempo2 de SQL Server funciona en JDBC?

Tengo algunos problemas para tratar de usar timestamp2 en lugar de Timestamp en SQL Server 2008. Aparentemente, rs.getTimestamp tiene un comportamiento muy diferente entre timestamp y timestamp2. Sin embargo, no puedo encontrar ninguna documentación que indique que debería haber una diferencia, o que debería estar usando algo diferente. Me pregunto si solo estoy haciendo algo mal.

Ambiente

Traté de SQL Express 2008 (10.0) y SQL Server 2008 R2 (10.5). sqljdbc4.jar versión 3.0, tamaño de 537,303 bytes, CRC-32 = a0aa1e25, MD5 = 402130141d5f2cee727f4371e2e8fd8a.Java 1.6

Aquí hay una prueba unitaria que demuestra el problema. La única "magia" es la "Db.getConnection ()", que puede reemplazar con el código apropiado. La prueba es la misma para datetime y datetime2, pero la prueba datetime2 falla con una fecha que es 2 días antes. Trato todos los tiempos en la base de datos como GMT / UTC, y no he intentado agregar información de zona horaria en los datos de la base de datos para datos 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
    }

¿Mi única opción es volver a la marca de tiempo?

EDIT: Para futuros Googlers, usando sqljdbc4.jar versión 3.0, la prueba falla en Linux, pero pasa en Windows. Todavía no he probado sqljdbc4.jar versión 4.0 que viene con SQL Server 2012.

Respuestas a la pregunta(2)

Su respuesta a la pregunta