1. #1
    Membre confirmé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    mai 2002
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 1 163
    Points : 594
    Points
    594

    Par défaut BETWEEN entre deux mois et deux années

    Bonsoir à tous,

    J'ai une table DECOMPTE qui contient les champs MOIS, ANNEE et MONTANT je souhaiterais récupérer les enregistrements se trouvant sur une plage de DEBUT_MOIS, DEBUT_ANNEE et FIN_MOIS, FIN_ANNEE

    Par exemple:

    Table DECOMPTE:

    ID MOIS ANNEE MONTANT
    1 2 2018 1000.00
    2 7 2018 2000.00
    3 1 2019 3000.00
    4 5 2019 4000.00

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE DECOMPTE (
        ID       INTEGER,
        MOIS     INTEGER,
        ANNEE    INTEGER,
        MONTANT  NUMERIC(18,2)
    );
    INSERTION:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    INSERT INTO DECOMPTE (ID, MOIS, ANNEE, MONTANT)
              VALUES (1, 2, 2018, 1000);
    INSERT INTO DECOMPTE (ID, MOIS, ANNEE, MONTANT)
              VALUES (2, 7, 2018, 2000);
    INSERT INTO DECOMPTE (ID, MOIS, ANNEE, MONTANT)
              VALUES (3, 1, 2019, 3000);
    INSERT INTO DECOMPTE  (ID, MOIS, ANNEE, MONTANT)
              VALUES (4, 5, 2019, 4000);


    La plage de recherche pour ne récupérer que l'ID 2 et 3 compris dans cette plage:

    DEBUT_MOIS=5 - DEBUT_ANNEE=2018
    FIN_MOIS=4 - FIN_ANNEE=2019


    J'ai utiliser l'instruction BETWEEN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM DECOMPTE  WHERE ((MOIS BETWEEN 5 AND 4) AND (ANNEE BETWEEN 2018 AND 2019));
    Et avec une autre variante sans le between:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM DECOMPTE  WHERE ((MOIS>=5 AND ANNEE>=2018) AND (MOIS<=4 AND ANNEE<=2019)) ;
    Malheureusement je n'obtiens pas le résultat escompter probablement à cause des deux mois et des deux année ?
    En comptant SVP sur votre aide.
    Le Savoir c'est le Pouvoir !
    S.Freud

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    9 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 9 318
    Points : 22 646
    Points
    22 646
    Billets dans le blog
    11

    Par défaut

    Bonjour,
    je propose ceci, multiplier l'année par 100 puis ajouter le mois
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM DECOMPTE  WHERE ANNEE*100+MOIS BETWEEN (201805 AND 201904)
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Berlin, Tokyo) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre confirmé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    mai 2002
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 1 163
    Points : 594
    Points
    594

    Par défaut

    Bonjour,

    Votre solution marche bien merci SergioMaster.
    Le problème est que je dois mettre des paramètres dans le BETWEEN une tentative comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM DECOMPTE WHERE ANNEE*100+MOIS BETWEEN (:DEBUT_ANNEE||:DEBUT_MOIS AND :FIN_ANNEE||:FIN_MOIS)
    Ne marche pas.
    Le Savoir c'est le Pouvoir !
    S.Freud

  4. #4
    Membre confirmé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    mai 2002
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 1 163
    Points : 594
    Points
    594

    Par défaut

    C'est réglé !

    Il faut faire ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM DECOMPTE WHERE ANNEE*100+MOIS BETWEEN (:DEBUT AND :FIN)
    Et c'est depuis le client qu'il faut faire la multiplication par 100 et l'addition du mois pour les valeurs des paramètres.
    Merci SergioMaster !
    Le Savoir c'est le Pouvoir !
    S.Freud

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    9 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 9 318
    Points : 22 646
    Points
    22 646
    Billets dans le blog
    11

    Par défaut

    Le problème est que je dois mettre des paramètres dans le BETWEEN une tentative comme:
    IL n'était pas question de paramètres dans le poste de départ et cela dépend de beaucoup de comment vous voulez les utiliser
    (dans une procédure ou par programme client)

    Alternatives dépendant du type de paramètres pour des procédures
    Entiers
    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
    CREATE PROCEDURE DECOMPTEGET    
     ( DAN INTEGER,
       DMOIS INTEGER,
       FAN INTEGER,
       FMOIS INTEGER) 
    RETURNS 
     ( ID INTEGER, 
       MOIS INTEGER,
       ANNEE INTEGER,
       MONTANT NUMERIC(18,2)
      ) 
    AS 
    BEGIN
      FOR SELECT ID, MOIS, ANNEE, MONTANT
          FROM DECOMPTE
          WHERE ANNEE*100+MOIS BETWEEN :DAN*100+:DMOIS AND :FAN*100+:FMOIS
          INTO :ID,:MOIS,:ANNEE,:MONTANT
      DO SUSPEND;    
    END^
    CHAR (si le mois est sous la forme MM)
    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
    ALTER PROCEDURE DECOMPTEGET (
        DAN CHAR(4),
        DMOIS CHAR(2),
        FAN CHAR(4),
        FMOIS CHAR(2) )
    RETURNS (
        ID Integer,
        MOIS Integer,
        ANNEE Integer,
        MONTANT Numeric(18,2) )
    AS
    BEGIN
      FOR SELECT ID, MOIS, ANNEE, MONTANT
          FROM DECOMPTE
          WHERE ANNEE*100+MOIS BETWEEN :DAN||:DMOIS AND :FAN||:FMOIS
          INTO :ID,:MOIS,:ANNEE,:MONTANT
      DO SUSPEND;    
    END^
    SET TERM ; ^
    ou VARCHAR Si le mois n'est pas sous forme MM alors traite le paramètre
    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
    SET TERM ^ ;
    ALTER PROCEDURE DECOMPTEGET (
        DAN CHAR(4),
        DMOIS VARCHAR(2),  -- il faut que ce soit un varchar
        FAN CHAR(4),
        FMOIS VARCHAR(2))
     
    RETURNS (
        ID Integer,
        MOIS Integer,
        ANNEE Integer,
        MONTANT Numeric(18,2)
    )
    AS
    BEGIN
      FOR SELECT ID, MOIS, ANNEE, MONTANT
          FROM DECOMPTE
          WHERE ANNEE*100+MOIS BETWEEN :DAN||(LPAD(:DMOIS,2,'0')) AND :FAN||(LPAD(:FMOIS,2,'0'))
          INTO :ID,:MOIS,:ANNEE,:MONTANT
      DO SUSPEND;    
    END^
    SET TERM ; ^
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Berlin, Tokyo) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  6. #6
    Membre confirmé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    mai 2002
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 1 163
    Points : 594
    Points
    594

    Par défaut

    Citation Envoyé par SergioMaster
    IL n'était pas question de paramètres dans le poste de départ
    Désolé, je voulais simplifier l'exemple.

    Je me contenterais d'un simple SELECT depuis le client avec la même ecriture que celle que de la SP (1ere alternative) j'essaye d'eviter au maximum les SP pour gérer la mémoire du serveur sauf quand il n' y a pas le choix.

    Encore merci SergioMaster
    Le Savoir c'est le Pouvoir !
    S.Freud

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

Discussions similaires

  1. [Toutes versions] Extraire nombre mois de plusieurs années entre deux dates
    Par Thib31 dans le forum Excel
    Réponses: 8
    Dernier message: 06/06/2016, 23h49
  2. Formule interval entre les mois de deux dates
    Par Youdi dans le forum Excel
    Réponses: 2
    Dernier message: 21/08/2015, 09h19
  3. Réponses: 2
    Dernier message: 21/10/2013, 16h49
  4. Comparaison entre les mois de deux dates
    Par meryam123 dans le forum JPA
    Réponses: 8
    Dernier message: 05/09/2011, 08h25
  5. Réaliser un BETWEEN entre 2 dates (mois, année)
    Par PpPool dans le forum Oracle
    Réponses: 3
    Dernier message: 26/04/2006, 10h20

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