开发者

JDBC Prepared Statement . setDate(....) doesn't save the time, just the date.. How can I save the time as well?

开发者 https://www.devze.com 2023-03-24 00:23 出处:网络
I have the following Query : INSERT INTO users (user_id, date_created) VALUES (?,?) I have the following prepared statement

I have the following Query :

INSERT INTO users (user_id, date_created) VALUES (?,?)

I have the following prepared statement

PreparedStatement insertUser = dbConnection.prepareStatemen开发者_开发百科t(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();

If I check the database, I find that it is inserting only today's date not the time though, so it would be : 2011-07-29 00:00:00

What should I put in the setDate() to get the time as well?


Instead of Date you should use a Timestamp and the setTimestamp method.

pratically you have to do something like that:

private static java.sql.Timestamp getCurrentTimeStamp() {
    java.util.Date today = new java.util.Date();
    return new java.sql.Timestamp(today.getTime());
}

....

preparedStatement.setTimestamp(4,getCurrentTimeStamp());


The Java type java.sql.Date will be normalized to represent only a SQL DATE and not an instant of Time. From the API documentation:

To conform with the definition of SQL DATE, the millisecond values wrapped by a java.sql.Date instance must be 'normalized' by setting the hours, minutes, seconds, and milliseconds to zero in the particular time zone with which the instance is associated.

The normalization explains why you are seeing 00:00:00 as the time.

If you want to retain the time information, consider using the Timestamp class that can represent both a Date and a Time.

Obviously, you should also use the corresponding SQL types to define your table structure; if you want to store timestamps in the database, use the SQL type preferred by your database. While some databases and their JDBC drivers might allow you to store timestamps in DATE columns, it is advisable to use the equivalent of the SQL TIMESTAMP type if it is available.


On SQLServerDatabase side define column as SMALLDATETIME and on java side use

Timestamp sqlDate = new Timestamp( System.currentTimeMillis() );
preparedStmt.setTimestamp( ++startIndex, sqlDate );

On SQLServerDatabase side don't specify column type as Timestamp else you will get the following exception.

Cannot insert an explicit value into a timestamp column. Use INSERT with a column list to exclude the timestamp column, or insert a DEFAULT into the timestamp column

0

精彩评论

暂无评论...
验证码 换一张
取 消