IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Mettre en forme une date


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 110
    Points : 66
    Points
    66
    Par défaut Mettre en forme une date
    Bonjour

    Je m’initie (avec plus ou moins de difficulté mais avec plaisir) depuis quelques temps à requêter des bases Oracles avec SQL_Developper.
    Voilà qu’aujourd’hui, je suis confronté à un problème, sûrement simple, mais dont je n’arrive pas à trouver la solution.

    C’est un problème de mise en forme de donnée.

    Je récupère des valeurs représentant une date mais au format YYYYMMDD (ex : 20111221).
    Ces valeurs sont insérées dans une table dont le champ est de type Varchar2 (8 byte)
    L’insertion ne pose aucun problème. Je retrouve bien mes valeurs dans ma table au format YYYYMMDD.

    Mais je souhaite dans un 1er temps affiché le contenu de ces dates dans un format plus lisible de type DD/MM/YYYY (ex : 21/12/2011)

    J’ai essayé plusieurs synthaxe avec to_char ou to_date mais rien n’y fait.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Select to_char(‘Ma_Date’,’YYYYMMDD’) from Ma_Table
    Select to_char(Ma_Date,’YYYYMMDD’) from Ma_Table
    Select to_date(‘Ma_Date’,’YYYYMMDD’) from Ma_Table
    Select to_date(Ma_Date,’YYYYMMDD’) from Ma_Table
    
    Des variantes avec des to_char et to_date imbriquées l’un dans l’autre
    
    Mais rien n’y fait. Je n’ai pas de message d’erreur. Seulement, un affichage vide du résultat.

    Je ne pense pas que la donnée insérée soit en cause car j'ai essayé sur une autre table avec des valeurs que j'ai insérée manuellement et là non plus, rien de rien...

    J’avoue que je sèche un peu et je ne trouve pas mon erreur dans les tutos du site.

    Si quelqu’un peut me conseiller, je suis preneur.

    Bonne journée

  2. #2
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Bonjour,

    Tout d'abord tu as une erreur dans ta requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT to_char(MaDate,'DD/MM/YYYY')
    FROM MaTable
    Il faut mettre le format que tu veux avoir et non pas le format que tu as déjà.

    Si tu as un affichage vide c'est qu'il n'y a aucune ligne retournée. Peux-tu nous montrer ta requête complète ?
    ~ Lola ~

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    table dont le champ est de type Varchar2 (8 byte)
    Ton but est de transformer une chaine en date.. donc pas de TO_CHAR !

    TO_DATE pour transformer une Chaine en Date
    TO_CHAR pour transformer une Date en Chaine

    poste le résultat de la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select madate, to_date(madate, 'YYYYMMDD') from matable where rownum < 10
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Points : 126
    Points
    126
    Par défaut
    Bonjour,

    Comme les données d'origine ne sont pas stockées comme des dates, il faut peut être faire 2 conversions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    With t As (
    Select '20110101' a From dual union all
    Select '20111201' a From dual union all
    Select '20111231' a From dual 
    )
    Select TO_DATE(TO_DATE(A, 'yyyymmdd'), 'dd/mm/yyyy') From T

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Oh non !! Jamais de to_date sur une date
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par francois78 Voir le message
    Je récupère des valeurs représentant une date mais au format YYYYMMDD (ex : 20111221).
    Ces valeurs sont insérées dans une table dont le champ est de type Varchar2 (8 byte)
    C'est une des pires erreurs (et des plus courantes aussi) qu'il soit possible de faire en terme de base de données : ne pas utiliser le bon type.
    Rien n'empêchera d'insérer la donnée 20111313 dans votre varchar.

    Modifiez votre table, transformez votre colonne au format DATE.

    Comme suggéré, vous devez faire une double conversion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH t AS
    (
    SELECT '20110101' a FROM dual union ALL
    SELECT '20111201'   FROM dual union ALL
    SELECT '20111231'   FROM dual 
    )
    SELECT TO_CHAR(TO_DATE(A, 'yyyymmdd'), 'dd/mm/yyyy') as dt
      FROM T;

  7. #7
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Autant pour moi, j'ai lu trop vite et n'avais pas bien vu le format de la colonne.

    Par curiosité : est-il possible de faire directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     SELECT to_date(MaDate,'DD/MM/YYYY')
    FROM MaTable
    Est-ce qu'il reconnait de lui-même les DD, MM et YYYY ?
    ~ Lola ~

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Non, le format de To_date correspond précisément à ce qu'il y a dans la colonne.. donc non oracle ne va pas deviner..
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    parfois il devine quand même un tout petit peu ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SQL> select to_date('1-nov-1811','DD/MM/RR') from dual;
     
    TO_DATE(1-NOV-1811
    -------------------
    1811-11-01_00:00:00
    pour ces bizarreries, se référer à la doc :
    http://docs.oracle.com/cd/E11882_01/...04.htm#g195479

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 110
    Points : 66
    Points
    66
    Par défaut
    Ouahou!!!!!!! Je vois que ma demande déchaîne les passions !!

    Après avoir lu quelques sujets sur différents forum, la maîtrise des données n'est pas acquise pour tout le monde, en particulier celle des conversion de date. Je parle pour moi bien sûr

    Citation Envoyé par McM Voir le message
    Ton but est de transformer une chaine en date.. donc pas de TO_CHAR !

    TO_DATE pour transformer une Chaine en Date
    TO_CHAR pour transformer une Date en Chaine

    poste le résultat de la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select madate, to_date(madate, 'YYYYMMDD') from matable where rownum < 10
    En attendant vos réactions, j'essaie de suite et vous tiens au courant
    Résultat
    DATE_CREATION TO_DATE
    ---------------------- -------------------------
    20110913 13/09/11
    20101203 03/12/10
    20070419 19/04/07
    20110326 26/03/11
    20101202 02/12/10
    20101203 03/12/10
    20110913 13/09/11
    20110927 27/09/11
    20110924 24/09/11

    9 lignes sélectionnées


    Mais en lisant et en relisant vos réponses, j'ai réfléchi avec ma tête et sur cette réponse ::
    Citation Envoyé par Waldar Voir le message
    C'est une des pires erreurs (et des plus courantes aussi) qu'il soit possible de faire en terme de base de données : ne pas utiliser le bon type.
    Rien n'empêchera d'insérer la donnée 20111313 dans votre varchar.

    Modifiez votre table, transformez votre colonne au format DATE.
    En regardant de plus près ma table, j'ai une donnée dans mon champ VARCHAR2 = 0

    Si je l'écarte alors ça marche beaucoup mieux

    Pour résumé :
    1. Je transforme mon VARCHAR2 en DATE
    2. Au moment de l'insertion, je converti la donnée comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO TO_CHAR(TO_DATE(A, 'yyyymmdd'), 'dd/mm/yyyy') AS dt
      FROM T;
    En attendant vos réponse ou vos réactions, j'essaie et je vous tiens au courant.

    A tout à l'heure

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 110
    Points : 66
    Points
    66
    Par défaut
    Ca fonctionne mais pas du 1er coup.

    Pourquoi ? Comme l'a très bien dit
    Citation Envoyé par Waldar Voir le message
    C'est une des pires erreurs (et des plus courantes aussi) qu'il soit possible de faire en terme de base de données : ne pas utiliser le bon type.
    Rien n'empêchera d'insérer la donnée 20111313 dans votre varchar.
    il faut donc maîtriser les données insérées dans une table.

    Seulement, j'ai un cas particulier qui coince.

    Je précise que je suis utilisateur habilité uniquement à requêter dans les bases ORACLE mais je ne recherche pas des problèmes de cohérence de donnée mais plutôt un dysfonctionnement de notre système. Toutefois, pour une obtenir un résultat exploitable issue de plusieurs tables, je créé mes propres tables et d'où ma question initiale sur le formatage de date.

    Mon cas particulier est le suivant : je suis amené à requêter une table avec des champs contenant une date au format YYMMDD mais son type de data est VARCHAR2.
    Sous certaines conditions, il est parfois logique qu'aucune date ne soit indiquée dans ce champ. Cela se traduit par une valeur = 00000000

    Évidement, avec ce que nous avons vu ci-dessus, nous arrivons à la conclusion que nous ne pouvons pas insérer une telle valeur dans un champ date.

    Et là, je bloque totalement

    Dois je modifier ma requête ou dois je modifier les caractéristiques du champ DATE de ma table pour prendre en compte ce cas particulier ?

    Je suis preneur de solutions diverses et variées.

    Merci d'avance.
    Bonne soirée

  12. #12
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Pourquoi pas transformer ce pas de date en NULL ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select to_date(nullif(tadate,'00000000'), 'yymmdd')  
    from (
        SELECT '20120101' tadate from dual union all
        SELECT '00000000' tadate from dual) t

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 110
    Points : 66
    Points
    66
    Par défaut
    Pacmann

    Tu m'as devancé mais je prends pour ma culture ton exemple que j'essaierai.

    J'ai trouvé une autre solution avec un case :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case Ma_Date
    when '00000000' then '01/01/01'
    else TO_CHAR(TO_DATE(Ma_Date, 'yyyymmdd'), 'dd/mm/yyyy')
    end
    Si d'autres idées, exprimez vous.
    La nuit porte conseil et je clôturais la demande demain matin

    Bonne nuit

  14. #14
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Le problème de ton case c'est que dans ton exemple tu remplace '00000000' par une date qui peut aussi apparaitre ailleurs dans ta base de données. Il vaut mieux remplacer par null.
    Si tu tiens à utiliser le case alors la syntaxe c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case Ma_Date
    when '00000000' then null
    else TO_CHAR(TO_DATE(Ma_Date, 'yyyymmdd'), 'dd/mm/yyyy')
    end
    ~ Lola ~

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 110
    Points : 66
    Points
    66
    Par défaut
    Bonjour à tous

    Pour répondre à Lola06, la date du 01/01/01 ne peut apparaître ailleurs dans la mesure où mon SI n'existait pas à cette époque.

    Mais rien n'est impossible. De plus, ta solution reflète plus la réalité car l'absence de date est le reflet des événements de notre SI.

    J'ai testé et cela fonctionne.

    Merci à tous et bonne journée

    Et attention au chocolat pour les prochains jours....

  16. #16
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Tout à fait, cela reflète mieux la réalité, et cela évite un certain nombre de désagréments de la valeur bidon.

    Par exemple, les statistiques basiques te calculent le nombre de NULL sur une colonne, alors que pour prendre en compte le biais induit par une valeur bidon, il faut des histogrammes...

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  17. #17
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    ce qui est chouette c'est d'insérer des valeurs bidons dans la base, comme ça nous les DBA on a toujours du boulot

    sqlplus 11.2.0.3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SQL> create table t(d date);
    Table created.
    SQL> insert into t values (round(date '9999-12-31','MM'));
    1 row created.
    SQL> commit;
    Commit complete.
    SQL> select d from t;
    D
    ---------
    01-JAN-00
    Toad 11.1.0.17
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SQL> create table t(d date)
    Table created.
    SQL> insert into t values (round(date '9999-12-31','MM'))
    1 row created.
    SQL> commit
    Commit complete.
    SQL> select d from t
    D        
    ---------
    01-JAN-01
    La différence est subtile

  18. #18
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Par exemple, les statistiques basiques te calculent le nombre de NULL sur une colonne, alors que pour prendre en compte le biais induit par une valeur bidon, il faut des histogrammes...
    D'autant que sans histogramme, la valeur bidon va perturber le calcul du facteur de filtrage pour les opérations de type range (>,< )
    Citation Envoyé par laurentschneider Voir le message
    La différence est subtile
    C'est horrible ça...

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

Discussions similaires

  1. [Dates] Mettre en forme une date
    Par joboy84 dans le forum Langage
    Réponses: 4
    Dernier message: 28/05/2009, 14h29
  2. Inserer ou mettre a jour une date
    Par davos56 dans le forum Bases de données
    Réponses: 18
    Dernier message: 23/04/2007, 16h25
  3. Réponses: 24
    Dernier message: 28/08/2006, 11h55
  4. mettre en Parametre une date
    Par mademoizel dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/06/2006, 13h43
  5. [VB]Comment mettre en forme une grille de données
    Par CBleu dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/02/2006, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo