У меня возникли проблемы с использованием timestamp2 вместо Timestamp в SQL Server 2008. По-видимому, 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.
- Ява 1.6
Вот модульный тест, демонстрирующий проблему. Единственная «магия» — это «Db.getConnection()», которую вы можете заменить соответствующим кодом. Тест одинаков как для datetime, так и для datetime2, но тест datetime2 терпит неудачу с датой, которая предшествует 2 дням. Я рассматриваю все времена в БД как 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. Я еще не пробовал sqljdbc4.jar версии 4.0, которая поставляется с SQL Server 2012.
expectedCal
после каждого теста? Кроме того, работает ли это, если вы передаете не календарь GMT, а экземпляр по умолчаниюCalendar
? - person Sanjay T. Sharma   schedule 02.11.2011JTDS
(о котором раньше не слышал, спасибо за ссылку) проходит.sqljdbc4.jar
(версия 2.0) работает. Ноsqljdbc4.jar
(версия 3.0) не работает. Варианты сейчас, наверное, есть. использовать jtds; б. используйте sqljdbc4.jar версии 2.0; в. конвертировать поля БД из datetime2 в datetime. Или д. сообщите об ошибке в Microsoft и подождите, пока они исправят свою проблему. - person Pixel   schedule 03.11.2011