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 très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    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
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 191
    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 191
    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.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Membre chevronné 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
    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
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 191
    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 191
    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).
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    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)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre chevronné 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
    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
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 191
    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 191
    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.)
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  8. #8
    J1
    J1 est déconnecté
    Membre expérimenté Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    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 chevronné 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
    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