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

Langage SQL Discussion :

[DB2] Sélection sur Mois/Année (champs séparés)


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 37
    Points
    37
    Par défaut [DB2] Sélection sur Mois/Année (champs séparés)
    Bonjour,

    J'ai besoin de récupérer une liste de facture dans une table suivant des critères de dates.

    Imaginez une table à 3 colonnes : Année / Mois / N° de facture.

    J'aimerais sélectionné tous les numéros de factures compris entre ces 2 dates 2005 / 09 et 2006 / 03.
    Excusez moi de cette question, mais quelle est la requête à formuler?

    Sachant qu'un select * from nomTable where Année >= 2005 and Année <= 2006 and Mois >= 09 et Mois <= 03 est érrroné.

    Cordialement

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 837
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 837
    Points : 52 930
    Points
    52 930
    Billets dans le blog
    5
    Par défaut
    SELECT ANNEE, MOIS, NUM_FACTURE
    FROM Matable
    WHERE (ANNEE * 12) + MOIS BETWEEN (2005 * 12) + 9 AND (2006 * 12) + 3

    -- autre formulation possible si votre SGBDR supporte le Row Value COnstructor :

    SELECT ANNEE, MOIS, NUM_FACTURE
    FROM Matable
    WHERE (ANNEE, MOIS) BETWEEN (2005, 9) AND (2006, 3)

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 37
    Points
    37
    Par défaut
    La logique de ta réponse semble correct pourtant je n'arrive pas à faire marcher la clause!

    Ma requête est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    select = "SELECT STE52, COMM52, TYCO52, PXVT52, MARG52"
    + " FROM "
    + BIBLIOTHEQUE_COMMISSION
    + "."
    + TABLE_AFFP52
    + " WHERE (ANNE52, MOIS52) BETWEEN ('"
    + codeAnnee1+"', '"+codeMois1+"') AND ('"+codeAnnee2+"', '"+codeMois2+"')";
    
    J'ai l'erreur suivante :

    java.sql.SQLException [SQL0104] Elément syntaxique , n'est pas correct. Eléments possibles : < > = <> <= !< !> != >= ¬< ¬> ¬= IN IS NOT LIKE BETWEEN.


    Une aide serait la bienvenue

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 837
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 837
    Points : 52 930
    Points
    52 930
    Billets dans le blog
    5
    Par défaut
    J'ai bien préciser, je me cite :
    si votre SGBDR supporte le Row Value COnstructor :
    Tu n'a pas précisé avec quel SGBDR tu travailles.

    As tu au moins regardé dans la doc que ton SGBDR accepte le RVC ? Peu l'accepte...

    Lisez l'article que j'ai écrit sur le sujet :
    http://sqlpro.developpez.com/cours/sqlaz/select/#L8


    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 37
    Points
    37
    Par défaut
    Je travail sur une base de données DB2
    Imaginons que le row value constructor n'est pas accepté, si je prend ton premier exemple, qu'elle est la subtilité avec les " * 12", je n'ai pas du tout saisi

  6. #6
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par Mynautor
    Imaginons que le row value constructor n'est pas accepté, si je prend ton premier exemple, qu'elle est la subtilité avec les " * 12", je n'ai pas du tout saisi
    La subtilité est de découper une année en 12 mois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ANNEE, MOIS, NUM_FACTURE
    FROM Matable
    WHERE ((ANNEE * 12) + MOIS) BETWEEN (2005 * 12) + 9 
                                    AND (2006 * 12) + 3
    C'est plus clair présenté ainsi ?
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 37
    Points
    37
    Par défaut
    Sachant que mes colonnes sont au formats "String", la clause ne peut pas marché j'imagine

  8. #8
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Alors fais simplement ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ANNEE, MOIS, NUM_FACTURE
      FROM Matable
     WHERE (ANNEE = '2005' AND MOIS >= '09')
        OR (ANNEE = '2006' AND MOIS <= '03')
    Si tu dois construire tes requêtes dynamiquement, sur des fourchettes de dates dont la différence peut être supérieur à une année, il faudra les gérer avec des clauses supplémentaires.

    Ex 1) entre février 2003 et juin 2005 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ANNEE, MOIS, NUM_FACTURE
      FROM Matable
     WHERE (ANNEE = '2003' AND MOIS >= '02')
        OR (ANNEE = '2004')
        OR (ANNEE = '2005' AND MOIS <= '06')
    Ex 2) entre février 2003 et septembre 2006 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ANNEE, MOIS, NUM_FACTURE
      FROM Matable
     WHERE (ANNEE = '2003' AND MOIS >= '02')
        OR (ANNEE = '2004')
        OR (ANNEE = '2005')
        OR (ANNEE = '2006' AND MOIS <= '09')
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ANNEE, MOIS, NUM_FACTURE
      FROM Matable
     WHERE (ANNEE = '2003' AND MOIS >= '02')
        OR (ANNEE IN ('2004',  '2005'))
        OR (ANNEE = '2006' AND MOIS <= '09')
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Avec des chaînes au format String, il suffit de faire :

    SELECT ANNEE, MOIS, NUM_FACTURE
    FROM Matable
    WHERE (ANNEE || MOIS) BETWEEN ('200509') AND ('200603')

    (|| étant l'opérateur de concaténation, mais cela varie, on peut trouver !!, concat, + ...)

    good luck

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

Discussions similaires

  1. Select sur mois années oracle
    Par khech dans le forum SQL
    Réponses: 3
    Dernier message: 16/02/2015, 11h21
  2. Réponses: 1
    Dernier message: 24/07/2009, 15h40
  3. Réponses: 2
    Dernier message: 20/02/2007, 10h29
  4. [MySQL] Tri sur champ au format date - uniquement mois/année
    Par skippy86 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/01/2007, 11h27
  5. Réponses: 16
    Dernier message: 29/04/2005, 14h39

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