Précédent   Forum du club des développeurs et IT Pro > Bases de données > Oracle > Débuter
Débuter Forum d'entraide pour débuter avec Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 31/10/2012, 17h15   #1
Towandaa
Invité régulier
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 27
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2011
Messages : 27
Points : 7
Points : 7
Par défaut Format de date différent selon users

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
ça me remonte bien quelque chose mais pour certains utilisateurs cela agit "normalement" c'est à dire que si le champ contient par exemple '20/10/15' on récupère '20151020'.

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
Towandaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2012, 17h22   #2
mnitu
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 4 104
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

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

Informations forums :
Inscription : octobre 2007
Messages : 4 104
Points : 7 994
Points : 7 994
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2012, 18h33   #3
Towandaa
Invité régulier
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 27
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2011
Messages : 27
Points : 7
Points : 7
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');
au lieu de

Code :
INSERT madate INTO matable VALUES (to_date('20/10/2015','DD/MM/YY'));
est ce que c'est possible et est ce que oui ça pourrait jouer?

Merci
Towandaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2012, 12h41   #4
mnitu
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 4 104
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

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

Informations forums :
Inscription : octobre 2007
Messages : 4 104
Points : 7 994
Points : 7 994
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é.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2012, 21h52   #5
Towandaa
Invité régulier
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 27
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2011
Messages : 27
Points : 7
Points : 7
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')
comme j'ai dit je ne me souviens plus de la syntaxe exacte que j'ai utilisée mais le principe étant d'ajouter 2000 à mon année et re-transformer tout ça en date.

Donc y aurait il une solution moins "bricolage"?

Merci!
Towandaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2012, 22h58   #6
skuatamad
Expert Confirmé
 
Inscription : août 2008
Messages : 1 690
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 690
Points : 2 813
Points : 2 813
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 :
1
2
3
UPDATE matable 
   SET madate = to_date('20' || substr(to_char(madate,'YYYYMMDDHH24MISS'),3),'YYYYMMDDHH24MISS')
 WHERE substr(to_char(madate,'YYYYMMDDHH24MISS'),1,2)='00'
Après ça reste forcément du bricolage.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2012, 22h31   #7
Towandaa
Invité régulier
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 27
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2011
Messages : 27
Points : 7
Points : 7
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
Towandaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h18.


 
 
 
 
Partenaires

Hébergement Web