SQL DATE vs java.sql.Date 中的时区
我对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