Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/01/2012, 13h34   #1
Futur Membre du Club
 
Inscription : septembre 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 65
Points : 15
Points : 15
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 :
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 :
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 :
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 :
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
cedrich est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 13h49   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Votre date porte tout simplement des heures / minutes / secondes.
Code :
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 :
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')
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 14h04   #3
Futur Membre du Club
 
Inscription : septembre 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 65
Points : 15
Points : 15
J'ai omis ce format là.

Soit :
Code :
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 :
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 :
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.
cedrich est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 14h29   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
C'est bizarre..
surtout cette commande
Code :
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 :
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
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 14h33   #5
Membre régulier
 
Christophe LE FLOCH
Inscription : août 2009
Messages : 105
Détails du profil
Informations personnelles :
Nom : Christophe LE FLOCH
Âge : 37

Informations forums :
Inscription : août 2009
Messages : 105
Points : 90
Points : 90
Par défaut date ou timestamp

Est ce que tu es sûr que ta colonne est au format date et non timestamp ?
mongolic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 15h03   #6
Futur Membre du Club
 
Inscription : septembre 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 65
Points : 15
Points : 15
@McM :
Code :
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 :
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 :
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.
cedrich est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 17h03   #7
Futur Membre du Club
 
Inscription : septembre 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 65
Points : 15
Points : 15
Voilà, j'ai trouvé pourquoi ma requête ci-dessous ne retourne rien...

Code :
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 :
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
cedrich est déconnecté   Envoyer un message privé Réponse avec citation 30
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h35.


 
 
 
 
Partenaires

Hébergement Web