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 :

Requete SQL calendrier


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut Requete SQL calendrier
    Bonjour,

    Je suis en train d'essayer de réaliser une requete pour selection les évenement qui se dérouleront dans 1 semaine :

    Pour cela il y a la table agenda_evenements :

    id - jours - mois - annee

    __________________________________________________

    Nous sommes le 31/03/2008
    Dans une semaine nous serons le 07/04/2008

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM agenda_evenements WHERE (jour<=07 AND mois<=04 AND annee<=2008) AND (jour>=31 AND mois>=03 AND annee>=2008)
    ___________________________________________________

    Le problème est bien visible : Il recherche les jours qui sont plus petit que 07 mais plus grand que 31 donc logique qu'il trouve aucun resultat.

    J'aurai besoin d'un petit coup de pouce.

    Merci

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 091
    Points : 31 510
    Points
    31 510
    Billets dans le blog
    16
    Par défaut
    Simple problème d'algèbre de Boole :

    Annee = 2008 AND (Mois = 3 AND Jour = 31 OR Mois = 4 AND Jour <= 8)

    A titre d'exercice, regardez ce qu'il se passe quand vous supprimez les parenthèses, vous pourrez juger du pouvoir attractif respectif de AND et OR.

  3. #3
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Simple problème d'algèbre de Boole :

    Annee = 2008 AND (Mois = 3 AND Jour = 31 OR Mois = 4 AND Jour <= 8)

    A titre d'exercice, regardez ce qu'il se passe quand vous supprimez les parenthèses, vous pourrez juger du pouvoir attractif respectif de AND et OR.
    Perso et même si ca peut dégrader les perf's je ferais un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    concat(concat(Annee,Mois),Jour) between '20080331' and '2008048'
    (enfin y'a d'autre facon de faire le concat ca depend du SGBD )

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 091
    Points : 31 510
    Points
    31 510
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par miloux32
    Perso et même si ca peut dégrader les perf's je ferais un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    concat(concat(Annee,Mois),Jour) BETWEEN '20080331' AND '2008048'
    Il existe bien entendu 36 façons de rédiger en SQL. Toutefois, le problème traité ici ne concerne pas ce langage, mais plutôt la manière de combiner les connecteurs logiques ET, OU (AND, OR).

  5. #5
    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
    Si la structure de ta base n'est pas figée, ce serait plus facile d'avoir la date d'évènement sous un type Date.
    A partir de là, ta requête devient extrêmement simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select ... where madate between CURRENT_DATE and (CURRENT_DATE + 7)

  6. #6
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Il existe bien entendu 36 façons de rédiger en SQL. Toutefois, le problème traité ici ne concerne pas ce langage, mais plutôt la manière de combiner les connecteurs logiques ET, OU (AND, OR).
    Outre le problème de connecteurs logiques auquel tu as repondu, il y a un probleme de gestion de date et de formalisme.

  7. #7
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 091
    Points : 31 510
    Points
    31 510
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par miloux32
    Outre le problème de connecteurs logiques auquel tu as repondu, il y a un probleme de gestion de date et de formalisme.
    Certes, certes. Concernant cet aspect du problème, al1_24 a parfaitement répondu : plutôt qu'atomiser les dates en Jour, Mois, An, il est préférable d'utiliser carrément le type Date, quitte au besoin à utiliser les fonctions DAY, MONTH, YEAR. (Pour la petite histoire, avec DB2, il a fallu attendre 1987 pour disposer de ce type que tout le monde attendait avec impatience.)

  8. #8
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Bonjour,

    Citation Envoyé par miloux32 Voir le message
    Perso et même si ca peut dégrader les perf's je ferais un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    concat(concat(Annee,Mois),Jour) between '20080331' and '2008048'
    (enfin y'a d'autre facon de faire le concat ca depend du SGBD )
    Passer par une comparaison de chaînes est envisageable, mais pour que cette méthode fonctionne, il faudra en revanche que tu penses à formater Mois et Jour sur 2 caractères chacun avant de les concaténer, et que ton BETWEEN reprenne le même principe, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BETWEEN '20080331' AND '20080408' /*à noter le '20080408', au lieu de '2008048'*/
    Si tu ne le fais pas, tu vas rencontrer des difficultés liées aux comparaisons de chaînes, puisqu'à titre d'exemple, la chaîne de caractères '20081128' est "inférieure" à '2008113'.

  9. #9
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par J1 Voir le message
    Bonjour,


    Passer par une comparaison de chaînes est envisageable, mais pour que cette méthode fonctionne, il faudra en revanche que tu penses à formater Mois et Jour sur 2 caractères chacun avant de les concaténer, et que ton BETWEEN reprenne le même principe, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BETWEEN '20080331' AND '20080408' /*à noter le '20080408', au lieu de '2008048'*/
    Si tu ne le fais pas, tu vas rencontrer des difficultés liées aux comparaisons de chaînes, puisqu'à titre d'exemple, la chaîne de caractères '20081128' est "inférieure" à '2008113'.
    Judicieuse remarque !
    tellement l'habitude d'avoir un champ varchar au format AAAAMMJJ que je n'avais plus fait gaffe a ce probleme !

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

Discussions similaires

  1. [AC-2007] Requete sql calendrier
    Par silverfly dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 03/08/2009, 09h22
  2. Problème Requete SQL et QuickReport
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/01/2004, 09h31
  3. requete sql
    Par autumn319 dans le forum ASP
    Réponses: 22
    Dernier message: 10/09/2003, 16h46
  4. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 11h24
  5. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43

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