【发布时间】:2012-03-01 10:49:39
【问题描述】:
我对 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
【问题讨论】:
-
我不太确定,但我唯一看到的是,它在调用 getTime() 方法时被转换为当前时区。
-
@novice_at_work:怎么样?
new java.sql.Date(0).getTime()产生0。那里没有时区问题...?转换必须在 JDBC 驱动程序或数据库中完成。 -
当你在上面说
new Date(0)时,是java.sql.Date还是java.util.Date? -
@AdamRofer:澄清。顺便说一句,没有
PreparedStatement.setDate(int, java.util.Date)方法... ;-)
标签: java sql date jdbc timezone