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

Oracle Discussion :

[oracle 8.1.7.4.0] tri d'une colonne de type DATE / VARCHAR2


Sujet :

Oracle

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut [oracle 8.1.7.4.0] tri d'une colonne de type DATE / VARCHAR2
    Bonjour,

    Suite à un problème dont je vous épargne les détails, je dois modifier les colonnes de type DATE en VARCHAR2(10) pour toutes les table de ma base Oracle 8i.

    Je me demande si l'utilisation de ces colonnes dans des clauses ORDER BY va retourner les données dans un ordre différent une fois ces modifications effectuées ?

    Merci d'avance.

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    oui bien sûr, 20/10/2005 sera classé après 10/11/2005.

  3. #3
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    aucun doutes !

    tu va avoir
    1
    10
    11
    ...
    2
    20
    21
    22
    ...
    3
    ...

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Ouahou quelle rapidité.

    Ok donc si j'applique systématiquement la fonction TO_DATE sur ces colonnes alors ce changement de type devrait être transparent que ce soit pour les ORDER BY, les clauses WHERE, etc. ?

    J'ai testé ça a l'air correct mais je voudrais avoir vos avis.

    Merci pour vos réponses.

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Transparent... presque... si la colonne n'est pas indexée, sinon il faut que remplaces ton index sur ta colonne par un index sur to_date (col).

  6. #6
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    c'est exact... et je conseille aussi d'indexer ces colonnes avec un index fonctionnel qui utilise aussi le to_date avec le même format que celui que tu va utiliser pour tes requêtes...

    sinon, le fait de faire un to_date sur ta colonne en varchar2 va exclure l'utilisation des indexes standards et ralentir tes Select...

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par plaineR
    Transparent... presque... si la colonne n'est pas indexée, sinon il faut que remplaces ton index sur ta colonne par un index sur to_date (col).
    D'accord et ça semble logique : il faut que je modifie mon index de manière à ce qu'il corresponde le plus possible à la "chaîne" que je vais utiliser fréquemment dans mes requêtes SQL.

    Citation Envoyé par Yorglaa
    et je conseille aussi d'indexer ces colonnes avec un index fonctionnel qui utilise aussi le to_date avec le même format que celui que tu va utiliser pour tes requêtes
    si je ne m'abuse ta remarque rejoint celle de plaineR si ce n'est que tu spécifies index fonctionnel et je t'avoue que cette notion n'évoque rien pour moi.
    Tu peux m'en dire plus ?

  8. #8
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    c'était juste un autre vocabulaire pour dire la même chose... (de l'anglais functional index)
    comme PlaineR a posté pendant que je rédigeait mon message, je ne l'avais pas vu...

    mais le but est bien d'indexer ta colonne AVEC la fonction to_date..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create index monIndex on maTable ( to_date(maColonneVarchar2, 'dd-mm-yyyy') ) ;

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Réponses nettes et précises dans un temps minimum.

    On reviendra.

    Merci encore à vous 2.

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    La création de l'index avec la fonction TO_DATE échoue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL> CREATE INDEX PR2010_1
      2      ON PR2010 ( CI_RS1, CC_NOM, TO_DATE(SA_DATE) );
        ON PR2010 ( CI_RS1, CC_NOM, TO_DATE(SA_DATE) )
                                            *
    ERREUR à la ligne 2 :
    ORA-01743: only pure functions can be indexed
    C'est bizarre mais le message d'erreur me semble pas trop en rapport avec l'erreur ????

  11. #11
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    en effet le message est étrange...
    toujours est-il qu'il manque le format de date à la fonction TO_DATE...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQL> CREATE INDEX PR2010_1 
      2      ON PR2010 ( CI_RS1, CC_NOM, TO_DATE(SA_DATE, 'DD-MM-YYYY') );
    j'ai mis DD-MM-YYYY comme format, mais tu peux mettre celui que tu veux...

  12. #12
    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
    Un petit rajout : Tu peux juste transformer ta date en char qui soit utilisé par les order by
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD') FROM DUAL
    Ca te donne 2005/10/28, 2005/11/01... et les ORDER BY vont marcher.

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Yorglaa >> tu es vraiment trop fort, c'est exactement ça pourtant dans mes requêtes SELECT je peux utiliser la fonction TO_DATE sans spécifier de format (même si j'avais bien vu que tu en utilisais un dans ton message)

    McM >> Euh... je ne te suis pas là. Tu peux expliquer autrement s'il te plait

  14. #14
    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
    Citation Envoyé par plaineR
    oui bien sûr, 20/10/2005 sera classé après 10/11/2005.
    Dans mon cas : "2005/10/20" sera classé avant "2005/11/10"

  15. #15
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par McM
    Un petit rajout : Tu peux juste transformer ta date en char qui soit utilisé par les order by
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD') FROM DUAL
    Ca te donne 2005/10/28, 2005/11/01... et les ORDER BY vont marcher.
    Oui c'est sûr, mais cela complique l'affichage... car je ne suis pas sûr que les utilisateurs vont se contenter d'une date inversée.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/06/2009, 22h39
  2. tri sur une colonne
    Par cubepiege dans le forum Langage SQL
    Réponses: 11
    Dernier message: 13/07/2006, 12h16
  3. Réponses: 16
    Dernier message: 10/11/2005, 22h51
  4. [JSP] tri sur une colonne
    Par soony dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 28/07/2005, 15h02
  5. [C#] [WinForms] Evènement sur le tri d'une colonne
    Par beway dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/03/2005, 16h43

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