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 Firebird Discussion :

BETWEEN entre deux mois et deux années


Sujet :

SQL Firebird

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

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    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.
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    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)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    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.
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

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

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    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 !
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    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 ; ^
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    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
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

+ 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