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

Oracle Discussion :

Problème avec les dates


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Points : 43
    Points
    43
    Par défaut Problème avec les dates
    Bonjour à tous,

    J'ai un problème avec le contenu d'une colonne qui contient une date apparemment fausse. Elle s'affiche correctement et n'est pas comparable à elle-même...

    Je précise que je suis en version Oracle 10.2.0.4.

    Soit les requêtes suivantes depuis une console sql plus:
    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
     
    select valide_du
    from sa_rubrique_emp
    where sa_rubriq_id = 172 and
             int_emp_id = 6502;
     
    VALIDE_DU
    ---------
    28-NOV-03
     
    select to_char(valide_du, 'dd.mm.yyyy')
    from sa_rubrique_emp
    where sa_rubriq_id = 172 and
             int_emp_id = 6502;
     
    TO_CHAR(VA
    ----------
    28.11.0003
     
    select valide_du
    from sa_rubrique_emp
    where valide_du = to_date('28.11.0003', 'dd.mm.yyyy');
     
    no rows selected => ???
     
    select to_char(valide_du, 'dd.mm.yyyy')
    from sa_rubrique_emp
    where valide_du < to_date('01.01.1901', 'dd.mm.yyyy');
     
    TO_CHAR(VA
    ----------
    28.11.0003
    Voici mon problème, je vois bien que la date "28.11.0003" existe par contre en utilisant une clause "WHERE" pour la retrouver, elle "n'existe" apparemment pas...

    En effectuant une requête sur une différence, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select valide_du - to_date('28.11.0003', 'dd.mm.yyyy')
    from sa_rubrique_emp
    where sa_rubriq_id = 172 and
             int_emp_id = 6502;
     
    VALIDE_DU-TO_DATE('28.11.0003','DD.MM.YYYY')
    --------------------------------------------
                                           -2191
    Là, je sais que la date est différente...

    J'ai bien trouvé un moyen de corriger les données avec la commande ci-dessous et j'aimerais identifier l'origine du problème pour le corriger à la source.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    update sa_rubrique_emp 
    set valide_du = to_date(to_char(valide_du, 'dd.mm.yyyy'), 'dd.mm.yyyy')
    where valide_du < to_date('01.01.1901', 'dd.mm.yyyy');
    La donnée apparaît :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select to_char(valide_du, 'dd.mm.yyyy')
    from sa_rubrique_emp
    where valide_du = to_date('28.11.0003', 'dd.mm.yyyy');
     
    TO_CHAR(VA
    ----------
    28.11.0003
    Est-ce que quelqu'un aurais une idée du problème??? J'imagine bien que la date n'est pas stocké correctement et j'aurais voulu identifier la différence entre les valeurs hexa... Est-ce une bonne idée et si oui comment? Via un export de la table et une analyse avec un outil approprié?

    De plus, il semblerait, suite aux échanges avec les dévelopeurs, que la donnée "corrompue" soit inséré via le JDBC, est-ce que cela aurait une influence?

    D'avance merci à vous,

    Cédric

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Votre date porte tout simplement des heures / minutes / secondes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT to_char(valide_du, 'dd.mm.yyyy hh24:mi:ss')
      FROM sa_rubrique_emp
     WHERE sa_rubriq_id = 172
       AND int_emp_id = 6502;
    Quand vous faites l'égalité de votre date avec to_date('28.11.0003', 'dd.mm.yyyy'), en réalité il chercher à comparer avec 28.11.0003 00:00:00, à la seconde près.

    Sans mettre à jour vos données, vous pouvez rechercher par plage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT valide_du
      FROM sa_rubrique_emp
     WHERE valide_du >= to_date('28.11.0003', 'dd.mm.yyyy')
       AND valide_du <  to_date('29.11.0003', 'dd.mm.yyyy')

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Points : 43
    Points
    43
    Par défaut
    J'ai omis ce format là.

    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select to_char(valide_du, 'dd.mm.yyyy hh24:mi:ss')
    from sa_rubrique_emp
    where sa_rubriq_id = 172 and
             int_emp_id = 6502;
     
    TO_CHAR(VALIDE_DU,'
    -------------------
    28.11.0003 00:00:00
    De plus la différence retourne un nombre de -2191 jours. Cela se vérfie en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select sysdate+1-sysdate
    from dual;
     
    SYSDATE+1-SYSDATE
    -----------------
                    1
    Il retourne bien un entier, donc je pense que le problème est plus sur le format d stockage interne de la date.

    En exécutant la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select to_char(valide_du, 'dd.mm.yyyy hh24:mi:ss')
    from sa_rubrique_emp
    where valide_du + 2191 = to_date('28.11.0003', 'dd.mm.yyyy');
     
    TO_CHAR(VALIDE_DU,'
    -------------------
    28.11.0003 00:00:00
    Et là, je n'ai plus d'idée pour identifier l'origine du problème.

    En effectuant votre commande avec l'intervalle, aucune ligne ne ressort, merci quand même de la proposition.

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    C'est bizarre..
    surtout cette commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT to_char(valide_du, 'dd.mm.yyyy hh24:mi:ss')
    FROM sa_rubrique_emp
    WHERE valide_du + 2191 = to_date('28.11.0003', 'dd.mm.yyyy');
     
    TO_CHAR(VALIDE_DU,'
    -------------------
    28.11.0003 00:00:00
    essaye de voir ce qu'il y a dedans avec un dump
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select dump(valide_du), to_char(valide_du, 'DD.MM.RRRR')
    FROM sa_rubrique_emp
    WHERE ...
    Tu devrais avoir ce résultat

    Typ=13 Len=8: 3,0,11,28,0,0,0,0
    28.11.0003

  5. #5
    Membre régulier
    Inscrit en
    Août 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2009
    Messages : 107
    Points : 124
    Points
    124
    Par défaut date ou timestamp
    Est ce que tu es sûr que ta colonne est au format date et non timestamp ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Points : 43
    Points
    43
    Par défaut
    @McM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT dump(valide_du), to_char(valide_du, 'DD.MM.RRRR')
    FROM sa_rubrique_emp
    where sa_rubriq_id = 172 and
          int_emp_id = 6502;
     
    DUMP(VALIDE_DU)
    --------------------------------
    TO_CHAR(VA
    ----------
    Typ=12 Len=7: 100,97,11,28,1,1,1
    28.11.0003
    Là, il y a une différence! Pour info, le NLS_LANG = AMERICAN_AMERICA.WE8ISO8859P15.

    En effectuant la commande suivante, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT dump(TO_DATE(TO_CHAR(VALIDE_DU, 'DD.MM.YYYY'), 'DD.MM.YYYY')),
           to_char(TO_DATE(TO_CHAR(VALIDE_DU, 'DD.MM.YYYY'), 'DD.MM.YYYY'), 'DD.MM.RRRR')
    FROM sa_rubrique_emp
    where sa_rubriq_id = 172 and
          int_emp_id = 6502;      
     
    DUMP(VALIDE_DU)
    --------------------------------
    TO_CHAR(VA
    ----------
    Typ=13 Len=8: 3,0,11,28,0,0,0,0
    28.11.0003
    En convertissant la date avant d'utiliser la fonction "dump()", j'obtiens le même résultat. Serait-ce un problème lors de l'insertion par le JDBC qui n'utiliserait pas les bons paramètres NLS? Un mauvais jeu de caractère lors de l'encodage dans la base?

    @monogolic :

    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
     
    desc sa_rubrique_emp
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     DATE_CREATION                             NOT NULL DATE
     USER_CREATION                             NOT NULL VARCHAR2(40)
     ELEMENT_CREATION                          NOT NULL NUMBER(16)
     DATE_MUTATION                                      DATE
     USER_MUTATION                                      VARCHAR2(40)
     STATUS                                    NOT NULL NUMBER(4)
     DB_ELEMENT_ID                             NOT NULL NUMBER(16)
     SA_RUBRIQ_ID                              NOT NULL NUMBER(16)
     INT_EMP_ID                                NOT NULL NUMBER(16)
     SEQ_TRI                                            NUMBER(4)
     POSITION                                  NOT NULL NUMBER(4)
     SA_CODE_SAISIE_CI                                  VARCHAR2(20)
     VALIDE_DU                                 NOT NULL DATE
     VALIDE_AU                                          DATE
     LIBELLE_SPECIFIQUE                                 VARCHAR2(255)
     SA_DEC_BASE_BUILD_ID                               NUMBER(16)
    J'avais vérifié en premier lieu.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Points : 43
    Points
    43
    Par défaut
    Voilà, j'ai trouvé pourquoi ma requête ci-dessous ne retourne rien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select int_emp_id, valide_du
    from sa_rubrique_emp
    where valide_du = to_date('28.11.0003', 'dd.mm.yyyy');
    Le problème est que la date saisie est inférieur à JC... Du coup, aucune valeur ne correspondait.

    Comme exemple :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    SELECT sa_rubriq_id,
           VALIDE_DU DATE_FOR_STD,
           TO_CHAR(VALIDE_DU, 'DD.MM.YYYYbc') DATE_FOR_EXPL,
           dump(TO_DATE(TO_CHAR(VALIDE_DU, 'DD.MM.YYYY'), 'DD.MM.YYYY'), 1010) DUMP_FNC_TO_DATE,
           dump(VALIDE_DU) DUMP_DEFAULT       
    FROM sa_rubrique_emp
    WHERE sa_rubriq_id IN (117, 163, 172)
    AND int_emp_id      = 6502;
    
    SA_RUBRIQ_ID DATE_FOR_STD        DATE_FOR_EXP
    ------------ ------------------- ------------
    DUMP_FNC_TO_DATE
    --------------------------------------------------------------------------------
    DUMP_DEFAULT
    --------------------------------------------------------------------------------
             117 01.01.2011 00:00:00 01.01.2011ad
    Typ=13 Len=8: 219,7,1,1,0,0,0,0
    Typ=12 Len=7: 120,111,1,1,1,1,1
    
             163 28.11.0003 00:00:00 28.11.0003ad
    Typ=13 Len=8: 3,0,11,28,0,0,0,0
    Typ=12 Len=7: 100,103,11,28,1,1,1
    
    SA_RUBRIQ_ID DATE_FOR_STD        DATE_FOR_EXP
    ------------ ------------------- ------------
    DUMP_FNC_TO_DATE
    --------------------------------------------------------------------------------
    DUMP_DEFAULT
    --------------------------------------------------------------------------------
    
             172 28.11.0003 00:00:00 28.11.0003bc
    Typ=13 Len=8: 3,0,11,28,0,0,0,0
    Typ=12 Len=7: 100,97,11,28,1,1,1
    
    =>
    
    select to_char(valide_du, 'dd.mm.yyyybc')
    from sa_rubrique_emp
    where valide_du = to_date('28.11.-0003', 'dd.mm.syyyy');
    
    TO_CHAR(VALI
    ------------
    28.11.0003bc
    J'ai eu le déclic en comparant les valeurs "dump" des dates dans le "format" de stockage Oracle.

    Je considère cet élément comme résolu, vu que le problème vient de l'insertion via l'application et non de la manière dont est stocké la donnée en base.

    Merci à tous pour votre aide.

    Excellente fin journée,

    Cédric

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/11/2005, 12h43
  2. problème avec les dates!!
    Par JauB dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/10/2005, 10h16
  3. problème avec les dates nulles
    Par shingo dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 30/09/2005, 13h32
  4. [SQL] problème avec les date et les group By
    Par Stef784ever dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/11/2004, 10h18
  5. Interbase - dbExpress -> problème avec les dates
    Par marghett dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/07/2004, 04h55

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