J'ai la requête suivante:
INSERT INTO users (user_id, date_created) VALUES (?,?)
J'ai la déclaration préparée suivante
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 je vérifie la base de données, je constate qu’elle n’insère que la date du jour, et non l’heure. Il s’agit donc de: 2011-07-29 00:00:00
Que dois-je mettre dans setDate()
pour obtenir le temps également?
Au lieu de Date, vous devez utiliser une méthode Timestamp et la méthode setTimestamp.
vous devez pratiquement faire quelque chose comme ça:
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());
Le type Java Java.sql.Date
sera normalisé pour ne représenter qu'un SQL DATE
et non un instant de temps. De la documentation de l'API:
Pour se conformer à la définition de SQL DATE, les valeurs millisecondes encapsulées par une instance Java.sql.Date doivent être «normalisées» en définissant les heures, minutes, secondes et millisecondes sur zéro dans le fuseau horaire auquel l'instance est associée .
La normalisation explique pourquoi vous voyez 00:00:00
comme heure.
Si vous souhaitez conserver les informations de l'heure, envisagez d'utiliser la classe Timestamp qui peut représenter à la fois une date et une heure.
Évidemment, vous devez également utiliser les types SQL correspondants pour définir la structure de votre table. Si vous souhaitez stocker des horodatages dans la base de données, utilisez le type SQL préféré par votre base de données. Certaines bases de données et leurs pilotes JDBC peuvent vous permettre de stocker des horodatages dans des colonnes DATE
, mais il est conseillé d’utiliser l’équivalent du type SQL TIMESTAMP
s’il est disponible.
Du côté SQLServerDatabase, définissez la colonne comme étant SMALLDATETIME et du côté Java
Timestamp sqlDate = new Timestamp( System.currentTimeMillis() );
preparedStmt.setTimestamp( ++startIndex, sqlDate );
Du côté SQLServerDatabase, ne spécifiez pas le type de colonne comme horodatage, sinon vous obtiendrez l'exception suivante.
Impossible d'insérer une valeur explicite dans une colonne d'horodatage. Utilisez INSERT avec une liste de colonnes pour exclure la colonne timestamp ou insérez un DEFAULT dans la colonne timestamp.