|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 50 ![]() |
Bonjour,
Comme indiqué Par SQL+ (voir pièce jointe), une valeur de champ DATE dans une table fait délirer Oracle 8i, planter TOAD et mon programme (Delphi). Cette valeur est insérée dans la table par du code Delphi qui fait, en gros : Table.Insert; Champ.AsString := AutreChamp.AsString (valeur 08/09/2007 15:59:00) Table.Post; Outre la méthode, discutable (mais ce n'est pas le sujet), je voudrais savoir ce qui pose pb à Oracle et comment y remédier à l'avenir. Merci à ceux qui ont déjà rencontré le pb de m'aider, je ne m'en sors pas ! |
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : septembre 2004 Messages : 2 942 ![]() |
Manifestement, la méthode discutable est en cause !
la colonne est une date ? Dans ce cas, pourquoi convertir en chaine, sans préciser de format ? |
|
|
00
|
|
|
#3 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Merci de changer le titre pour rendre la discussion plus claire
|
|
|
00
|
|
|
#4 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 50 ![]() |
Par défaut, Delphi utilise le format de date courte de Windows (et ça fonctionne très bien, toute l'application fait ça, ça représente des millions de lignes sans pb...).
Ce que je voudrais savoir, c'est ce qui gêne Oracle ? Après tout, une date est un flottant... Cela voudrait-il dire qu'il y a des valeurs de flottants qui font qu'Oracle se vautre ? Est-ce un pb connu ? Faut-il faire un arrondi de sioux ? Merci pour ton aide. |
|
|
00
|
|
|
#5 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
ce qui géne c'est que tu stockes une donnée qui est une chaine de caractère et pas une date... donc tu peux même mettre 32/13/1950 25:60:97 si ça te change
![]() une date c'est pas un flottant, c'est une date donc un type qui a des propriétés particulières Edit : après avoir revu l'erreur... ça ressemble furieusement à un bug de TO_CHAR quand même
|
|
|
00
|
|
|
#6 | |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 50 ![]() |
Citation:
C'est peut-être là que je dois creuser ? Parce que le champ d'origine, comme indiqué dans le 1er post, est une date valide qui ne fait pas couiner Oracle : 08/09/2007 17:59:00 |
|
|
|
00
|
|
|
#7 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
propriété de date classique : pas plus de 24h/j, 60 min/h, 60s/min, etc...
tu veux pas faire un desc de ta table comme le suggére leo ? et que donne : Code :
SELECT TO_DATE('08/09/2007 16:60:01', 'DD/MM/YYYY HH24:MI:SS) FROM dual et la version compléte de la base ? |
|
|
00
|
|
|
#8 | ||
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
essaye :
Code :
|
||
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() Inscription : septembre 2004 Messages : 2 942 ![]() |
A mon avis, des conversion sous delphi sans préciser de formats ont dû "corrompre" la colonne (rien ne dit que delphi appelle to_date... il convertit peut-être lui même en float à sa sauce et passe le float à Oracle qui le convertit en date).
D'où l'importance du desc ! |
|
|
00
|
|
|
#10 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 50 ![]() |
Code :
Je suis d'accord avec toi, Leo, la conversion doit être à l'origine du pb. Mais pourquoi ? Les décimales correspondent à des fractions de temps : 1 seconde = 1/86400 = 0,0000115741 qui est un arrondi à la 10ème décimale car l'opération ne se termine jamais, il y a une suite de 740740 etc... Donc, en principe, si la plus petite unité gérée par Oracle est la seconde, les champs devraient contenir des multiples de 0,0000115740. Mais Oracle ne couine pas s'ils contiennent autre chose, il arrondit à la seconde et c'est tout (du moins j'en ai l'impression). Donc je ne vois pas ce qui peut poser pb... or il y en a bien un, et un gros ! De plus, je le répète, ce sont chaque mois des centaines de millions de lignes qui sont ainsi insérées sans pb et, à ma connaissance, ce bug de date ne s'est produit que 3 ou 4 fois... |
||
|
|
00
|
|
|
#11 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 50 ![]() |
Code :
|
||
|
|
00
|
|
|
#12 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
si tu envoies des 0,0000115741 dans des colonnes DATE j'veux bien croire qu'Oracle bug... il n'est pas aussi précis
Ca doit être un bug référencer chez Delphi c'est pas possible autrement
|
|
|
00
|
|
|
#13 | |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 50 ![]() |
Citation:
je n'envoie rien, je cherche juste à comprendre... Oracle stocke une date avec l'heure 15:59:00 sous cette forme ; ,665972 Or, c'est bien le résultat de l'opération ((15 x 3600) + (59 x 60) ) / 86400. Donc j'en conclus qu'une seconde vaut 0,0000115741, c'est tout... Mais si, au lieu d'ajouter 0,0000115741 j'ajoute juste 0,0000115000, par exemple, Oracle ne couine pas, il arrondit. Donc je me demande ce qui le fait couiner dans mon cas ![]() Et je vais maintenant espérer que ce cas s'est déjà produit pour un autre visiteur de ce forum... |
|
|
|
00
|
|
|
#14 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
ha bon ?
Comment t'as vu qu'il stocke ça comme ça ?
|
|
|
00
|
|
|
#15 | ||
|
Membre confirmé
![]() Inscription : octobre 2006 Messages : 221 ![]() |
Stockage de date (j'ai lu dans cet forum?):
Code :
10g - même à 8i? DAB |
||
|
|
00
|
|
|
#16 | |||
|
Expert Confirmé
![]() Inscription : septembre 2004 Messages : 2 942 ![]() |
Sur une 8i :
Code :
Note metalink 69028.1 Citation:
Faites un dump de votre colonne corrompue et vous verrez d'où vient l'erreur... je suis prêt à parier que 6 vaut 60 au lieu de valoir 0. |
|||
|
|
00
|
|
|
#17 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 50 ![]() |
|
|
|
00
|
|
|
#18 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
la syntaxe a déjà été donné maintes fois :
|
|
|
00
|
|
|
#19 |
|
Expert Confirmé
![]() Inscription : septembre 2004 Messages : 2 942 ![]() |
Y'a pile-poil deux exemples dans ma précédente réponse....
|
|
|
00
|
|
|
#20 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 50 ![]() |
Code :
Donc, admettons que ce soit l'instruction Delphi qui soit foireuse (une fois sur des millions) : comment elle fait ? Expliquez-moi svp comment je peux provoquer ça, ça m'aidera peut-être à trouver dans le code l'origine du pb... Ensuite, comme je ne ppeux pas corriger tout le code, la solution la plus simple pour garantir que tout est ok me paraît un trigger after insert et after update pour faire ce DATE+0.5 -0.5 qui semble tout remettre d'aplomb. Mais je trouve ça coûteux, voyez-vous une autre solution ? Merci pour votre aide. |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com