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 :

Comment rechercher une plage de date explosé dans 3 colonnes différentes ?


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 26
    Points
    26
    Par défaut Comment rechercher une plage de date explosé dans 3 colonnes différentes ?
    Bonjour,

    J'ai une base de données (mysql) avec des dates dedans. le problème c'est qu'elles sont entrées dans 3 colonnes (une colonne pour le jour, une autre pour le mois, et une autre pour l'année)

    Par exemple :

    Jour | Mois | Année
    01 | 01 | 2006
    23 | 08 | 2007
    10 | 12 | 2006
    26 | 09 | 2007

    J'ai ensuite créé un formulaire qui me permet de rechercher un plage de date. Par exemple je souhiaterai sélectionner toutes mes dates du 01/02/2007 au 01/09/2007.

    Est-il possible de créer une requête SQL qui fait cela avec les contraites de ma base (3 colonnes pour définir une date) ?

    Si quelqu'un a une idée je suis prenneur car malgrés mes recherche je ne trouve pas de solution.

    Merci d'avance.
    ;-)

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Lisez cet article : http://sql.developpez.com/sqlaz/select/#L8

    D'autre part, n'oubliez pas de préciser la version de MySQL car les versions antérieures à la 4.1 ne supportent pas les sous-requêtes et cela peut conditionner la réponse.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 26
    Points
    26
    Par défaut
    Merci pour ce lien très intéressant. Mais j'ai peur que ma version d'SQL ne soit pas compatible (ou ce n'est pas la bonne syntaxe).

    Car quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM XXX WHERE (JOUR) > ('20')
    Ca marche, par contre quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM XXX WHERE (DEJOUR, DEMOIS) > ('20','10')
    Il y a un message d'erreur :
    SQL error: [IBM][Pilote ODBC iSeries Access][DB2 UDB]SQL0104 - Elément syntaxique , n'est pas correct. Eléments corrects : < > = <> <= ¬< ¬> ¬= >= IN IS NOT LIKE BETWEEN.,
    J'utilise php5 et une base DB2 (sur un AS400).

    Arf, on y est presque...

    Merci en tout cas de ton aide, car ça avance ;-)

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par le_binr
    J'utilise php5 et une base DB2 (sur un AS400)
    Je ne connais pas DB2 mais vu le message d'erreur cela signifie très certainement que DB2 - en tout cas la version que vous avez - ne supporte pas la syntaxe du ROW VALUE CONSTRUCTOR.
    On peut déplacer votre message dans le forum DB2 mais je crois que vous ne soyez obligé d'utiliser la 2ème syntaxe décrite dans l'article que je vous ai indiqué plus haut.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    En effet, j'ai donc trouvé une solution qui a l'air de fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT *
    FROM   XXX
    WHERE  ((AN >= ('$rech_annee_1')
             AND (MOIS >= ('$rech_mois_1'))
             AND (JOUR >= ('$rech_jour_1')))
            AND (AN <= ('$rech_annee_2')
                 AND (MOIS <= ('$rech_mois_2'))
                 AND (JOUR <= ('$rech_jour_2'))))
    En jouant avec les parenthèse et les AND ça à l'aire de fonctionner, même si ce n'est pas un requête SQL très obtimisé, mais i n'y a pas le choix.

    Merci pour le lien, ca ma permis de trouver la solution !
    ;-)

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 400
    Points
    28 400
    Par défaut
    Je ne crois pas que ce soit la bonne requête

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Avec autant de parenthèses inutiles qui, en plus, complexifient la lisibilité de la requête, ce n'est pas surprenant

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 26
    Points
    26
    Par défaut
    Pourtant ça a l'aire de fonctionner (c'est vrai que la requête n'est pas très .. esthétique ;-) ). Vous auriez une autre idée pour rendre tout cela plus conventionnelle ?

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 400
    Points
    28 400
    Par défaut
    As-tu testé quelque chose comme : "15/05/2006 entre 01/01/2006 et 01/01/2007" avec ta requête ?

  10. #10
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    salut,

    Moi, je pencherais vers la concatenation AAAAMMJJ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select digits(champannee)!!digits(champmois)!!digits(champsjour)
    from table
    si le champs jour et mois sont bien sur une longueur de 2 alors digits mettra un 0 sur la gauche pour completer la longueur. (Attention ca ne fonctionnera pas si la longueur du champ jour est de 3)

    Jérôme

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    En effet, la 1er requête n'est pas bonne... j'en ai trouvé une beaucoup plus sympathique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM XXX where AN concat MOIS concat JOUR between '$date_debut' and '$date_fin'
    En sachant que $date_debut et $date_fin sont de type AAAAMMJJ

    Merci pour vos conseils !
    ;-)

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 12/09/2008, 10h09
  2. Réponses: 15
    Dernier message: 17/01/2008, 17h02
  3. Réponses: 16
    Dernier message: 14/09/2006, 06h43
  4. Comment rechercher une chaine dans plusieurs tables ?
    Par tsing dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/11/2005, 18h04
  5. [date] Recherche dans une plage de dates
    Par astro84 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 28/06/2005, 17h13

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