2011-07-29 12 views
19

Tengo la siguiente consulta:Declaración preparada de JDBC. setDate (....) no guarda el tiempo, solo la fecha .. ¿Cómo puedo guardar el tiempo también?

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

Tengo la siguiente declaración preparada

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(); 

Si puedo comprobar la base de datos, me parece que se está insertando no sólo la fecha de hoy el tiempo sin embargo, por lo que Sería: 2011-07-29 00:00:00

¿Qué debería poner en el setDate() para obtener el tiempo también?

Respuesta

33

En lugar de Fecha se debe utilizar un Timestamp y la setTimestamp método.

práticamente que tiene que hacer algo así:

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()); 
+0

http://www.mkyong.com/jdbc/how-to-insert-timestamp-value-in-preparedstatement/ –

5

El tipo Java java.sql.Date se normalizará a representar sólo una SQL DATE y no un instante de tiempo. De la documentación API:

para ajustarse a la definición de FECHA SQL, los valores de milisegundos envueltos por una instancia java.sql.Date deben ser 'normalizado' mediante el establecimiento de las horas, minutos, segundos y milisegundos a cero en la zona horaria particular con la que está asociada la instancia.

La normalización explica por qué está viendo 00:00:00 como la hora.

Si desea conservar la información de tiempo, considere utilizar la clase Timestamp que puede representar tanto una fecha como una hora.

Obviamente, también debe usar los tipos SQL correspondientes para definir la estructura de su tabla; si desea almacenar marcas de tiempo en la base de datos, use el tipo de SQL que prefiera su base de datos. Mientras que algunas bases de datos y sus controladores JDBC pueden permitirle almacenar marcas de tiempo en columnas DATE, es aconsejable usar el equivalente al tipo SQL TIMESTAMP si está disponible.

0

Por el lado SQLServerDatabase definen columna como SMALLDATETIME y el uso de Java lado

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

Por el lado SQLServerDatabase no especifique tipo de columna de marca de hora de lo contrario obtendrá la siguiente excepción.

No se puede insertar un valor explícito en una columna de marca de tiempo. Use INSERT con una lista de columnas para excluir la columna de marca de tiempo, o inserte un VALOR PREDETERMINADO en la columna de marca de tiempo

+0

Usé un tipo de datos Timestamp mysql para la columna y funcionó perfectamente, sin excepciones. –

Cuestiones relacionadas