JDBC准备好的声明.setDate(....)不保存时间,只保存日期..我怎样才能节省时间?

Wae*_*ada 21 java jdbc prepared-statement

我有以下查询:

INSERT INTO users (user_id, date_created) VALUES (?,?)
Run Code Online (Sandbox Code Playgroud)

我有以下准备好的声明

PreparedStatement insertUser = dbConnection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

insertUser.setInt(1, 7);
java.util.Date now = new java.util.Date(System.currentTimeMillis());
insertUser.setDate(2, new java.sql.Date((new Date(System.currentTimeMillis())).getTime()));
insertUser.executeUpdate();
Run Code Online (Sandbox Code Playgroud)

如果我检查数据库,我发现它只插入今天的日期而不是时间,所以它将是: 2011-07-29 00:00:00

我还应该把setDate()时间花在什么上呢?

Mau*_*res 37

而不是Date,您应该使用TimestampsetTimestamp方法.

实际上你必须做那样的事情:

private static java.sql.Timestamp getCurrentTimeStamp() {
    java.util.Date today = new java.util.Date();
    return new java.sql.Timestamp(today.getTime());
}
Run Code Online (Sandbox Code Playgroud)

....

preparedStatement.setTimestamp(4,getCurrentTimeStamp());
Run Code Online (Sandbox Code Playgroud)


Vin*_*lds 6

Java类型java.sql.Date将被规范化以仅表示SQL DATE时间而不是时刻的瞬间.从API文档:

为了符合SQL DATE的定义,java.sql.Date实例包含的毫秒值必须通过在与实例关联的特定时区中将小时,分钟,秒和毫秒设置为零来"标准化". .

规范化解释了为什么你看到00:00:00的时间.

如果要保留时间信息,请考虑使用可以表示日期和时间的Timestamp类.

显然,您还应该使用相应的SQL类型来定义表结构; 如果要在数据库中存储时间戳,请使用数据库首选的SQL类型.虽然某些数据库及其JDBC驱动程序可能允许您将时间戳存储在DATE列中,但建议使用等效SQL TIMESTAMP类型(如果可用).