В процессе отладки я заканчиваться простым примером:Сумасшедший драйвер MS SQL Server JDBC в поле даты или времени часового пояса?
select convert(datetime, '2015-04-15 03:30:00') as ts
go
Apr 15 2015 03:30AM
(1 row affected)
select convert(int, datediff(second, '1970-01-01 00:00:00',
convert(datetime, '2015-04-15 03:30:00'))) as ts
go
1429068600
(1 row affected)
$ TZ=UTC date [email protected] +%F_%T
2015-04-15_03:30:00
Когда я выполнить запрос из JDBC Я получаю 2 разных результатов не равно выше !!!! Код:
String TEST_QUERY = "select convert(datetime, '2015-04-15 03:30:00') as ts";
PreparedStatement stmt2 = conn.prepareStatement(TEST_QUERY);
ResultSet rs = stmt2.executeQuery();
rs.next();
logger.info("getTimestamp().getTime(): {}", rs.getTimestamp("ts").getTime());
logger.info("getDate().getTime(): {}", rs.getDate("ts").getTime());
stmt2.close();
результат выполнения (I перепроверить результат с Coreutils date
утилиты):
=> getTimestamp().getTime(): 1429057800000
$ TZ=UTC date [email protected] +%F_%T
2015-04-15_00:30:00
=> getDate().getTime(): 1429045200000
$ TZ=UTC date [email protected] +%F_%T
2015-04-14_21:00:00
Official docs for date types and JDBC Java mapping ничего не говорят о результате разницы ...
Моя программа выполнена в GMT+03:00
часовом поясе и У меня есть SQL Server 2008 и попробуйте с драйверами JDBC 4.0 и 4.1 от https://msdn.microsoft.com/en-us/sqlserver/aa937724.aspx
Мое ожидание получить временную метку UTC (с 1970 года) во всех случаях, что верно только для утилиты Linux ODBC tsql
, которую я использую для интерактивного отладки запросов.
WTF?
Могу ли я попросить разъяснения - SQL Server 'datetime' использует временную метку UTC? Он не может установить временную привязку, скорректированную на локальную зону, поскольку «дневное сохранение» нарушает значения в течение половины года. Является ли SQL Server преобразованием значения типа datetime в промежуточное значение, которое принимает TZ в учетной записи, когда оно появляется в запросе 'select'? Я не понимаю, почему драйвер JDBC читает сервер TZ и пытается компенсировать разницу. – gavenkoa
Внутренний формат, в котором база данных хранит значения Timestamp, не имеет отношения к вопросу. Тем более, что вы не запрашиваете какую-либо таблицу. У вас разные результаты, потому что запросы, которые вы напрямую загружали в базу данных, * не семантически эквивалентны * в сочетании с JDBC + результатом, который вы выполняли на Java. Если вы зададите другой вопрос, вы, вероятно, получите другой ответ. –
Драйверы JDBC должны использовать локальный часовой пояс JVM, запускающего приложение, а не сервер (хотя SQL Server может нарушить это правило, не уверен). –