IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Date et Timestamp


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut Date et Timestamp
    Bonjour,

    J'ai un soucis. J'ai une fonction qui map les types java vers SQL et vice versa lorsque je veux faire une opération sur ma base de données.
    Dans ma base j'ai des tables avec des types DATE. Lorsque je fais des enregistrements, j'obtiens bien des date en base avec des heures/minutes/secondes. L'inverse est faux, lorsque je récupère les données de la base et que j'obtiens l'objet java.sql.Date, ces données sont tronquées, dommage, après tout c'est marqué dans la javadoc...

    Sauf que je veux ces informations, alors je décide de changer dans SQL Developer mes DATE en TIMESTAMP.
    Le problème, c'est que lorsque je veux récupérer ces derniers, je n'arrive à rien avec le type qu'il me retourne, c'est à dire un oracle.sql.TIMESTAMP. Je pensais qu'il allait me retourner un java.sql.Timestamp...

    Un extrait de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    if (res != null)
    {
    	ResultSetMetaData meta = res.getMetaData();
    	while (res.next())
    	{
    		HashMap<String, Object> map = new HashMap<String, Object>();
    		String columnName = "";
    		for (int i = 0; i < meta.getColumnCount(); i++)
    		{
    			columnName = meta.getColumnName(i + 1).toUpperCase();
    			Object o = res.getObject(columnName);
    			if (o instanceof java.sql.Date)
    			{
    				map.put(columnName, new Date(((java.sql.Date) o).getTime()));
    			}
    			else if (o instanceof oracle.sql.TIMESTAMP)
    			{
    				// ça n'entre jamais ici ! Pourtant o.getClass() == oracle.sql.TIMESTAMP
    			}
    			else if (o instanceof java.math.BigDecimal) // int
    			{
    				map.put(columnName, ((java.math.BigDecimal) o).intValue());
    			}
    			else // String, null
    			{
    				map.put(columnName, o);
    			}
    		}
     
    		lstResults.add(map);
    	}
    	res.close();
    }
    Quelqu'un aurait-il une solution pour récupérer une java.lang.Date précise (sans les heures/minutes/secondes tronquées) ? Vu que la solution timestamp a l'air compromise...

    Merci d'avance

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res.getTimestamp(columnName)
    getObject() ne sert pas vraiment à ça, c'est plutôt pour des cas spécialisés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    else if (o instanceof oracle.sql.TIMESTAMP)
    {
      // ça n'entre jamais ici ! Pourtant o.getClass() == oracle.sql.TIMESTAMP
    }
    C'est très étonnant et je me permets d'en douter. Ça pourrait arriver, par exemple si oracle.sql.TIMESTAMP étendait java.sql.Date. Dans ce cas, ce serait la première condition qui s'applique, puisque c'est la première vraie.
    Mais, ce serait stupide, et sur mon driver oracle ce n'est pas le cas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut
    Bonjour,

    getTimestamp() fait l'affaire, merci. Je l'avais vu, mais je voulais rester sur getObject(). J'utilise cette fonction sur plein de table, donc je ne connais pas le type de chaque colonne à l'avance.

    C'est très étonnant et je me permets d'en douter.
    Eh pourtant ! Je viens de ressayer, il n'entre jamais dedans! Je trouve ça dingue, pourtant j'en ai utilisé des instanceof dans la vie, et c'est la première fois qu'un me fait défaut.
    Pour palier à ce soucis, j'ai un if moins élégant... Mais mes dates Java sont désormais non tronquées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    if (o instanceof java.sql.Date)
    {
    	map.put(columnName, new Date(((java.sql.Date) o).getTime()));
    }
    else if (o != null && o.getClass().getSimpleName().equals("TIMESTAMP"))
    {
    	map.put(columnName, res.getTimestamp(i + 1));
    }
    else if (o instanceof java.math.BigDecimal) // int
    {
    	map.put(columnName, ((java.math.BigDecimal) o).intValue());
    }
    else // String, null
    {
    	map.put(columnName, o);
    }

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Bien joué. Je pense que ça doit être un conflit dans les ClassLoaders, ça arrive assez souvent avec les drivers JDBC.

    Mais je ne saurais pas trop comment investiguer plus avant.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Dates] Probleme timestamp Linux/Windoz
    Par fadex dans le forum Langage
    Réponses: 5
    Dernier message: 14/03/2007, 15h59
  2. [MySQL] Tri par date avec timestamp
    Par shutdown76 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 05/01/2007, 02h37
  3. [Dates] Format Timestamp
    Par Marmottux72000 dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2006, 15h31
  4. [Dates] Format date avec timestamp
    Par otagun dans le forum Langage
    Réponses: 11
    Dernier message: 27/05/2006, 15h16
  5. date et timestamp
    Par tomy4ever dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/03/2006, 19h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo