Смещение UTC вычитается из значения TIMESTAMP WITH TIME ZONE в HSQLDB

Я использую HSQLDB 2.4.0 и вижу, что возвращаются неожиданные значения TIMESTAMP WITH TIME ZONE.

Я запускаю следующий код с часовым поясом JVM UTC+2.

try (Connection connection = this.dataSource.getConnection();
     PreparedStatement preparedStatement = connection.prepareStatement(
             "SELECT '1960-01-01 23:03:20+02:00' "
           + "FROM (VALUES(0))");
     ResultSet resultSet = preparedStatement.executeQuery()) {

  OffsetDateTime expected = OffsetDateTime.parse("1960-01-01T23:03:20+02:00");
  while (resultSet.next()) {
    assertEquals(expected, resultSet.getObject(1, OffsetDateTime.class));
    assertEquals("1960-01-01 23:03:20+02:00", resultSet.getObject(1, String.class));
  }
}

Второе утверждение успешно, но первое терпит неудачу. Вместо ожидаемого значения 1960-01-01T23:03:20+02:00 я получаю 1960-01-01T21:03:20+02:00, что на два часа раньше ожидаемого значения. Это ошибка или ожидаемое поведение?

изменить

После некоторого дополнительного исследования кажется, что вычитается не смещение UTC местного часового пояса, а смещение UTC TIMESTAMP WITH TIME ZONE.

Если я изменю '1960-01-01 23:03:20+02:00' на CAST('1960-01-01 23:03:20+02:00' AS TIMESTAMP WITH TIME ZONE) + INTERVAL '2:00' HOUR TO MINUTE, я получу 1960-01-01T21:03:20+02:00. Точно так же '1960-01-01 23:03:20+05:00' отстает на пять часов, но CAST('1960-01-01 23:03:20+02:00' AS TIMESTAMP WITH TIME ZONE) + INTERVAL '5:00' HOUR TO MINUTE дает мне 1960-01-01T21:03:20+05:00.


person Philippe Marschall    schedule 07.05.2017    source источник


Ответы (1)


Это похоже на ошибку, которая была исправлена ​​​​в следующем выпуске. Вы можете проверить код SVN /base/trunk и скомпилировать его с помощью Gradle или Ant.

person fredt    schedule 10.05.2017