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 :

Oracle - Date : Rechercher avec la partie Time


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 23
    Points : 20
    Points
    20
    Par défaut Oracle - Date : Rechercher avec la partie Time
    Bonjour,

    Je suis en train de travailler sur une application où celle-ci doit être compatible Oracle et SQLServer.

    Dans ce cadre, j'ai décidé de supprimer les utilisations de TO_DATE et TO_CHAR (peut-être une mauvaise idée). Suite à cela, je me suis rendu compte que je n'avais bien compris le fonctionnement des dates entre JAVA et Oracle notamment concernant les recherches "FROM - TO".

    Nous utilisons dans l'application pour les dates des colonnes DATE dans Oracle. Selon les parties de l'application, les dates sont enregistrés ou non avec la partie Time.

    Quand j'utilise la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT TO_CHAR(COLUMN, 'dd/MM/yyyy HH24:mi:ss') FROM TABLE;
    Je me retrouve soit avec un résultat sans la partie Time 18/03/2014 00:00:00 soit avec 13/08/2014 09:54:18

    Quand je fais une recherche, j'ai comme critère une java.util.Date sans la partie TIME. Quand dans mon PreparedStatement, je fais une recherche sur le premier cas avec la partie Time pas dans la base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            if (applicationDateFrom != null)
            {
                where.append("\n AND qdoc.qdoc_application_date >= :xApplicationDateFrom ");
                params.put("xApplicationDateFrom", applicationDateFrom);
            }
     
            if (applicationDateTo != null)
            {
                where.append("\n AND qdoc.qdoc_application_date <= :xApplicationDateTo ");
                params.put("xApplicationDateTo", applicationDateTo);
            }
    Cela fonctionne. Par contre si j'ai la partie Time dans la base, on trouve un petit trick :

    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
     
            if (dateFrom != null)
            {
                where.append("\n AND qinc.qinc_creation_date >= :xDateFrom ");
                params.put("xDateFrom", dateFrom);
            }
     
            if (dateTo != null)
            {
                where.append("\n AND qinc.qinc_creation_date < :xDateTo ");
                GregorianCalendar to = new GregorianCalendar();
                to.setTime(dateTo);
                to.add(Calendar.DAY_OF_MONTH, 1);
                params.put("xDateTo", to.getTime());
            }
    Ce que j'aimerai, c'est de pouvoir utiliser la première partie du code et quand dans ma requête la partie Time soit évaluée.

    Si on reprend ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            if (applicationDateTo != null)
            {
                where.append("\n AND qdoc.qdoc_application_date <= :xApplicationDateTo ");
                params.put("xApplicationDateTo", applicationDateTo);
            }
    Si la date est enregistrée dans la base comme 03.04.2014 15:00:00 et que mon paramètre est une Date représentant 03.04.2014 16:00:00 que l'enregistrement sorte et qu'il ne sorte pas si mon critère est 03.04.2014 14:00:00.

    J'ai essayé de passé ma colonne dans Oracle en TimeStamp. J'ai également essayé de convertir la paramètre en java.sql.TimeStamp mais rien n'y fait.

    Auriez-vous des suggestions à me faire ?

    Tout cela ne doit pas être très clair, mais je n'arrive pas à faire mieux Posez moi des questions si je peux rendre tout cela plus compréhensible.
    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Citation Envoyé par Kelem Voir le message
    Ce que j'aimerai, c'est de pouvoir utiliser la première partie du code et quand dans ma requête la partie Time soit évaluée.
    Cette phrase est incompréhensible, probablement parce qu'elle est grammaticalement incorrecte. Il manque un verbe quelque part et du coup je ne comprend pas la demande.


    Citation Envoyé par Kelem Voir le message
    Si on reprend ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            if (applicationDateTo != null)
            {
                where.append("\n AND qdoc.qdoc_application_date <= :xApplicationDateTo ");
                params.put("xApplicationDateTo", applicationDateTo);
            }
    Si la date est enregistrée dans la base comme 03.04.2014 15:00:00 et que mon paramètre est une Date représentant 03.04.2014 16:00:00 que l'enregistrement sorte et qu'il ne sorte pas si mon critère est 03.04.2014 14:00:00.
    si tu teste date <= à paramètre, si tu as 03.04.2014 15:00:00 en base, le test est positive pour le paramètre 03.04.2014 16:00:00 et négative pour le paramètre 03.04.2014 14:00:00. Du coup je ne vois pas où est ton problème :/

    Attention que c'est le setTimestamp() que tu dois utiliser en jdbc et pas setDate() qui, lui, tronque les heures du paramètre. Bref ton type java dois toujours correspondre au type utilisé dans la définition de la base.
    Si tu as créé une colonne de type DATE, c'est setDate() / getDate()
    Si tu as créé une colonne de type DATETIME, c'est setTimestamp() / getTimestamp()
    Si tu as créé une colonne de type TIME, c'est setTime() / getTime()

    A noter une chose importante que tu semble ne pas prendre en compte: les timezone. Il y a de fortes chance que ton application locale ne travaille pas dans la même timezone que le serveur. C'est problématique avec les colonnes de type DateTime, où tu pourrais avoir un décalage de 1h ou deux entre gmt et locale francaise, mais c'est catastrophique avec DATE, car les heure son tronquée à minuit et c'est un décalage de 1 jour que tu pourrais obtenir (aujourd'hui minuit => hier 23:00 => hier)

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    Oui effectivement la première phrase n'était pas correcte.

    Concernant la seconde partie que tu cites, c'est ce que je souhaitais obtenir. Mais comme tu me le soulignes après, c'était bien le fait d'appeler setDate() et non setTimestamp() qui posait problème. J'avais une classe Helper qui affectait comme setDate mon Timestamp dans le preparedStatement.

    Je vais bien prendre en compte la problématique des Timezone.

    Merci beaucoup d'avoir pris le temps de répondre.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/05/2007, 13h44
  2. formulaire de recherche avec les dates
    Par chelmi95 dans le forum Access
    Réponses: 5
    Dernier message: 25/10/2006, 21h00
  3. [Oracle] type date: comparaison avec l'année en cours
    Par zchallal dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/06/2006, 07h39
  4. Réponses: 1
    Dernier message: 14/05/2006, 19h52
  5. [Oracle] Oracle et problème avec les dates
    Par Nounoursonne dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/01/2006, 15h31

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