|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Étudiant Inscription : novembre 2011 Messages : 27 ![]() |
Bonjour à tous!
Alors voilà, je travaille sur une base oracle que je n'ai pas monté moi même et qui comprend plusieurs utilisateurs (même structures données différentes). Je cherche à remonter une date sous un format précis. Dans ma table elle apparaît au format 'DD/MM/YY' je fais un Code :
SELECT to_char(madate, 'YYYYMMDD') FROM matable Et cependant sur d'autres utilisateurs ça agit bizarrement et ça me remonte '00151020' Je re-précise que c'est le même champ de la même table. Je n'ai pas monté les structures moi même donc je ne sais pas si cette différence est normale, mais en tout cas j'aimerai savoir comment "forcer" la base de l'utilisateur bizarre à mieux traiter ses objets date. Merci à vous |
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 4 104 ![]() |
Quel est le type des données de la zone madate : date ou varchar2 ?
Une date n’a pas de format, elle à une représentation interne fixe. Le format existe seulement pour afficher la date comme une chaine des caractères ou pour transformer une chaine des caractères en type date. |
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Étudiant Inscription : novembre 2011 Messages : 27 ![]() |
C'est bien une date mais je soupçonne qu'elle a été renseignée directement
Code :
INSERT madate INTO matable VALUES ('20/10/15'); Code :
INSERT madate INTO matable VALUES (to_date('20/10/2015','DD/MM/YY')); Merci |
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 4 104 ![]() |
Une fois que la date a été insérée dans la base elle est bien déterminée et concerne soit l'année 2015 soit l'année 15!
Quand, pour insérer dans une table ayant une colonne de type date, vous fournissez une chaîne des caractères, une conversion implicite doit avoir lieu parce qu'une date n'est pas une chaine des caractères. Cette conversion implicite utilise le contenu de la variable d’environnement NLS_DATE_FORMAT pour trouver le format. Mais se baser sur des conversions implicite est source d'erreurs. Donc vous devez toujours convertir la chaîne des caractères supposant à représenter la date via une conversion explicite (To_date) et utilisez le format approprié. |
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Étudiant Inscription : novembre 2011 Messages : 27 ![]() |
Ah d'accord donc oui apparemment les 2 dates exemples ont été insérées différemment , celle concernant l'année 15 n'ayant pas été insérée via un to_date .
La question reste ouverte sur le moyen de rétablir cette mauvaise insertion pour qu'elle reprenne un bon format. Vu que je devais agir vite j'ai fait un truc dont je ne me souviens pas vraiment n'étant plus sur place mais qui était à mon avis assez crade , un truc genre: Code :
UPDATE matable SET madate = to_date((to_number(to_char(madate,'YYYYMMDD'))+20000000),'DD/MM/YYYY') Donc y aurait il une solution moins "bricolage"? Merci! |
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé
![]() Inscription : août 2008 Messages : 1 690 ![]() |
C'est clair que c'est laid... Les bonnes dates ont aussi été incrémentées non ? en plus il y a perte des heures min sec...
J'aurais fait comme ça : Code :
|
||
|
|
00
|
|
|
#7 |
|
Invité régulier
![]() Étudiant Inscription : novembre 2011 Messages : 27 ![]() |
Ce champ est de toute manière une date renseignée sans heure donc c'est pas grave pour mon cas particulier. Et pour mon cas particulier toujours, toutes mes dates étaient censées être supérieures à 2000 et elles étaient toutes pourries donc je ne me suis pas souciée d'un "where". Mais effectivement ta solution semble plus propre que la mienne pour une table moins "uniformément pourrie"^^
Je vais mettre le sujet en résolu mais si jamais quelqu'un a une autre solution "qu'elle est encore meilleure" n'hésitez pas |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com