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 :

Sélection des enregistrements du mois M-1 dans Oracle7


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Sélection des enregistrements du mois M-1 dans Oracle7
    Bonjour à tout,
    Par cette requête ci-dessous, je souhaite visualiser dans une base donnée Oracle7 et cela tous les mois, les enregistrements du mois M-1 à une date précise. Soit le 5 de chaque mois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT     *
    FROM         INCIDENTS
    WHERE    (TO_CHAR(DATE_HEURE_DEBUT, 'YYYY/MM/DD') >= TO_CHAR((to_date('01/' || to_char(sysdate,'MM/YYYY'))-1), 
    'YYYY/MM') || '/01') AND  (TO_CHAR(DATE_HEURE_DEBUT, 'YYYY/MM/DD') < TO_CHAR(sysdate, 
    'YYYY/MM') || '/01')
    Mais elle ne donne rien.
    Exemple: je veux transférer ou faire un SELECT des enregistrements du mois d'Avril 2009 le 5 mai 2009.

  2. #2
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Tu peux essayer comme suit

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM   INCIDENTS
    WHERE  TO_CHAR(DATE_HEURE_DEBUT,'YYYYMM') = TO_CHAR(add_months(SYSDATE,-1),'YYYYMM');

  3. #3
    Invité
    Invité(e)
    Par défaut
    je pense qu'il est temps d'utiliser les fonctions adéquates au lieu de s'amuser à convertir en caractères...
    Niveau performance et indexes, ça serait mieux !

    Essaie-ça, j'ai pas testé mais c'est une piste plus propre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM INCIDENTS
    WHERE  
    DATE_HEURE_DEBUT >= ADD_MONTHS( TRUNC(SYSDATE, 'MONTH'), -1 )
    AND 
    DATE_HEURE_DEBUT < TRUNC ( SYSDATE , 'MONTH' )

  4. #4
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    OK,

    peut etre effectivement que en Oracle 7 , mieux vaux ... ne pas utiliser to_char

    En 10G , le plan est le meme , le temps d'execution est le meme ...
    il passe dans les deux cas en INDEX FAST FULL SCAN

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par fatsora Voir le message
    En 10G , le plan est le meme , le temps d'execution est le meme ...
    il passe dans les deux cas en INDEX FAST FULL SCAN
    Même avec un index sur la date ?

  6. #6
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Surtout avec un index sur la date ...

  7. #7
    Invité
    Invité(e)
    Par défaut
    je ne vais pas épilogué 107 ans mais en 10g, j'ai des différences de plans d'exécutions avec une table qui contient 15000 entrées.

    Voici mes rapides scripts de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
      CREATE TABLE TEST 
       (	ID NUMBER NOT NULL ENABLE, 
    	DEB_DAT DATE, 
    	 CONSTRAINT TEST_PK PRIMARY KEY (ID) ENABLE
       ) ;
     
       CREATE INDEX TEST_DEB_DAT ON TEST (DEB_DAT) ;
     
     
    begin
      for k in 1 .. 15000 loop
        INSERT INTO TEST (ID,DEB_DAT)  select nvl(maX(id)+1,1) id, to_date(sysdate- DBMS_RANDOM.VALUE(0,10000) )  DEB_DAT from test ;
      end loop;
      commit;
    end;
    /
     
     
    SELECT     *
    FROM         test
    WHERE    (TO_CHAR(DEB_DAT, 'YYYY/MM/DD') >= TO_CHAR((to_date('01/' || to_char(to_date ('01/09/2004','DD/MM/YYYY'),'MM/YYYY'))-1), 'YYYY/MM') || '/01') 
    AND  (TO_CHAR(DEB_DAT, 'YYYY/MM/DD') < TO_CHAR(to_date ('01/09/2004','DD/MM/YYYY'), 'YYYY/MM') || '/01') ;
     
    SELECT *
    FROM   test
    WHERE  TO_CHAR(DEB_DAT,'YYYYMM') = TO_CHAR(add_months(to_date ('01/09/2004','DD/MM/YYYY'),-1),'YYYYMM');
     
    SELECT *
    FROM test
    WHERE 
    DEB_DAT >= ADD_MONTHS( TRUNC(to_date ('01/09/2004','DD/MM/YYYY') , 'MONTH'), -1 )
    AND 
    DEB_DAT < TRUNC ( to_date ('01/09/2004','DD/MM/YYYY') , 'MONTH' ) ;
    les deux premières requêtes font un full scan et la dernière passe par l'index.

  8. #8
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Juste pour info ... ca a le merite d'exister

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    >CREATE TABLE TEST1
    (
      COL_1    VARCHAR2(40 BYTE)                    ,
      DEB_DAT  DATE                                ,
      COL_2    NUMBER(15,5),
      COL_3    NUMBER(15,5),
      COL_4    NUMBER(15,5),
      COL_5    NUMBER(15,5),
      COL_6    NUMBER(15,5),
      COL_7    NUMBER(15,5)
    )
    TABLESPACE USERS
    ;
     
    >insert /*+ append */ into test1 select * from test;
    3176393 rows created.
     
    commit
    ;
     
     >CREATE INDEX OWNER_HISTO.IDX_TEST1 ON OWNER_HISTO.TEST1
      2  ( COL_1,DEB_DAT)
      3  LOGGING
      4  TABLESPACE USERS
      5  PCTFREE    10
      6  INITRANS   2
      7  MAXTRANS   255
      8  STORAGE    (
      9              INITIAL          64K
     10              NEXT             1M
     11              MINEXTENTS       1
     12              MAXEXTENTS       UNLIMITED
     13              PCTINCREASE      0
     14              BUFFER_POOL      DEFAULT
     15             )
     16  NOPARALLEL;
     
    Index created.
     
     >SELECT col_1,deb_dat
    FROM   test1
    WHERE  TO_CHAR(DEB_DAT,'YYYYMM') = TO_CHAR(add_months(to_date ('01/09/2004','DD/MM/YYYY'),-1),'YYYYMM');  2    3
     
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 4122059633
     
    ---------------------------------------------------------------------------
    | Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |       |   246 |  7626 |  6205   (3)| 00:01:15 |
    |*  1 |  TABLE ACCESS FULL| TEST1 |   246 |  7626 |  6205   (3)| 00:01:15 |
    ---------------------------------------------------------------------------
     
    > alter table test1 modify col_1 not null  ;
     
    Table altered.
     
     >alter table test1 modify deb_dat not null;
     
    Table altered.
     
     
     >SELECT col_1,deb_dat
    FROM   test1
    WHERE  TO_CHAR(DEB_DAT,'YYYYMM') = TO_CHAR(add_months(to_date ('01/09/2004','DD/MM/YYYY'),-1),'YYYYMM');  2    3
     
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3190404073
     
    ----------------------------------------------------------------------------------
    | Id  | Operation            | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT     |           |   246 |  7626 |  4006   (3)| 00:00:49 |
    |*  1 |  INDEX FAST FULL SCAN| IDX_TEST1 |   246 |  7626 |  4006   (3)| 00:00:49 |
    ----------------------------------------------------------------------------------

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15
    Points : 14
    Points
    14
    Par défaut solution à la requête M-1
    Au vue des différentes réponses, celle-ci me donne satisfaction.
    Merci des riches contributions, c'est très cool

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM INCIDENTS
    WHERE  
    DATE_HEURE_DEBUT >= ADD_MONTHS( TRUNC(SYSDATE, 'MONTH'), -1 )
    AND 
    DATE_HEURE_DEBUT < TRUNC ( SYSDATE , 'MONTH' )

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

Discussions similaires

  1. [WD12E] Sélection des enregistrements dans une fenêtre RAD
    Par nambours dans le forum WinDev
    Réponses: 4
    Dernier message: 26/04/2010, 09h16
  2. Requête sélection des enregistrements avec une '
    Par Vodjedi dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/04/2009, 16h57
  3. Insertion des enregistrements d'une table temporaire dans un état
    Par Chayanne47 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 18/04/2008, 11h46
  4. Sélection des enregistrements du mois
    Par vlksoft dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 18/09/2007, 23h36
  5. Recherche des enregistrements du mois précédent
    Par xenos dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/07/2007, 13h14

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