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

Administration Oracle Discussion :

colonne date indexée utlisée avec des fonctions dans des requêtes


Sujet :

Administration Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 137
    Points : 59
    Points
    59
    Par défaut colonne date indexée utlisée avec des fonctions dans des requêtes
    Bonsoir,

    J’ai une requête sur une colonne vente_date de type date est indexée(index non unique) parce que on peut avoir plusieurs valeurs à la même seconde

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Select * 
    From vente
    Where trunc(vente_date)< ‘15/02/2007
    Et dans d’autres requêtes j’utilise
    Aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Select * 
    From vente
    Where to_char(vente_date,'DD/MM/YYYY')> '15/12/2006'
    Malheureusement l’index n’est pas vu par oracle, et les requêtes sont assez lente, pourriez vous svp me proposer une solution de contournement afin de bénéficier de mon index et d’avoir un résultat optimisé.

    Merci d’avance de vos suggestions.

  2. #2
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    Tu peux essayer de rempacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select *
    From vente
    Where trunc(vente_date)< ‘15/02/2007
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select *
    From vente
    Where vente_date< to_date('15/02/2007','DD/MM/YYYY')
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select *
    From vente
    Where to_char(vente_date,'DD/MM/YYYY')> '15/12/2006'
    (A savoir que ta requête là compare des string, ce qui n'est pas vraiment conseillé alors que je pense que tu veux comparr des dates, non ?)
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select *
    From vente
    Where vente_date>= to_date('15/12/2006','DD/MM/YYYY')+1
    A savoir de plus, que tes requêtes exclues toutes deux la date du 15 fev.

    Nicolas.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    tu peux aussi faire un index AVEC la fonction qui t'intéresse, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX monIndex_truncVente ON vente (trunc(vente_date)) ;
    mais ensuite, ce que dit nGasparotto reste parfaitement valable...
    c'est à dire qu'il faut comparer une date avec une date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM vente
    WHERE trunc(vente_date)< to_date('15022006','ddmmyyyy')
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  4. #4
    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
    C'est vrai que le trunc dans le premier cas n'est pas utile.
    Par contre la deuxième requête est fausse

    to_char(vente_date,'DD/MM/YYYY')> '15/12/2006'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT 1
    FROM dual
    WHERE TO_CHAR(SYSDATE,'DD/MM/YYYY')> '15/12/2006'
    Vu que c'est du char, c'est de la comparaison caractère par caractère
    Si SYSDATE = 15/02/2007
    1 5 / 1 2 / 2 0 0 6
    = = = > = = = = = <
    1 5 / 0 2 / 2 0 0 7

    Pour comparer des dates dans ce cas, faut utiliser le format Année, puis mois, puis jour (séparateur que tu veux). YYYY/MM/JJ
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. Comment ajouter des séries dans des graphes sur des feuilles variables
    Par Molomarcopolo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/07/2012, 16h26
  2. créer des fonctions dans des boucles
    Par aku84 dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 17/07/2011, 18h44
  3. Enchainer des fonctions dans un onclick d'un bouton
    Par jpg dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/10/2004, 16h51
  4. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 12h32
  5. [VBA-E] Ajouter des fonctions dans Excel
    Par Clezio dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/03/2004, 01h18

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