Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Invité régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2011
    Messages : 32
    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

  2. #2
    Expert Confirmé Sénior Avatar de mnitu
    Homme Profil pro Marius Nitu
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    4 580
    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 580
    Points : 8 297
    Points
    8 297

    Par défaut

    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.

  3. #3
    Invité régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2011
    Messages : 32
    Points : 7
    Points
    7

    Par défaut

    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

  4. #4
    Expert Confirmé Sénior Avatar de mnitu
    Homme Profil pro Marius Nitu
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    4 580
    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 580
    Points : 8 297
    Points
    8 297

    Par défaut

    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é.

  5. #5
    Invité régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2011
    Messages : 32
    Points : 7
    Points
    7

    Par défaut

    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!

  6. #6
    Expert Confirmé
    Inscrit en
    août 2008
    Messages
    2 125
    Détails du profil
    Informations forums :
    Inscription : août 2008
    Messages : 2 125
    Points : 3 704
    Points
    3 704

    Par défaut

    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.

  7. #7
    Invité régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2011
    Messages : 32
    Points : 7
    Points
    7

    Par défaut

    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

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •