Я немного смущен поведением типа данных SQL DATE по сравнению с типом java.sql.Date
. Возьмем следующее утверждение, например:
select cast(? as date) -- in most databases
select cast(? as date) from dual -- in Oracle
Подготовить и выполнить оператор с помощью Java
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setDate(1, new java.sql.Date(0)); // GMT 1970-01-01 00:00:00
ResultSet rs = stmt.executeQuery();
rs.next();
// I live in Zurich, which is CET, not GMT. So the following prints -3600000,
// which is CET 1970-01-01 00:00:00
// ... or GMT 1969-12-31 23:00:00
System.out.println(rs.getDate(1).getTime());
Другими словами, временная метка GMT, привязанная к заявлению, становится временной меткой CET, которую я возвращаю. На каком шаге добавлен часовой пояс и почему?
Примечание:
-
Я заметил, что это верно для любой из этих баз данных:
DB2, Derby, H2, HSQLDB, Ingres, MySQL, Oracle, Postgres, SQL Server, Sybase ASE, Sybase SQL Anywhere
- Я заметил, что это неверно для SQLite (у которого действительно нет истинных типов данных
DATE
) - Все это не имеет значения при использовании
java.sql.Timestamp
вместоjava.sql.Date
- Это аналогичный вопрос, который не отвечает на этот вопрос: java.util.Date vs java.sql.Date