Во время отладки я заканчиваю простым примером:
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();
Результат выполнения (я дважды проверяю результат с помощью утилиты 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
Официальные документы для типов дат и отображения Java JDBC не говорят о приведенной разнице...
Моя программа выполнена в часовом поясе 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?