web-dev-qa-db-fra.com

Déclaration préparée par JDBC. setDate (....) ne gagne pas le temps, juste la date .. Comment puis-je gagner du temps aussi?

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?

20
Wael Awada

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());
35
Maurício Linhares

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.

6
Vineet Reynolds

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.

0
A Jakhar