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

problème de vérification avec between.


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Par défaut problème de vérification avec between.
    Bonjour tout le monde,

    Mon problème est le suivant
    j'ai une table horaire contenant n lignes chaque ligne de la table est définie par 4 attributs : code_personne,hr_debut,hr_fin,jour.

    Or lors de l'insertion d'une ligne,il faudrait vérifier que la personne X est libre de l'heure1(debut) à l'heure2(fin).

    Exemple:
    si une personne e1 enseigne le lundi de 8 à 10, il faudrait d'abord vérifier qu'il est libre le lundi de 8 à 10hr.

    J'ai fait ma propre requête en utilisant la négation, mais ça marche pas comme je veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "  select count(*) from horaire where CODE_personne = '"+per+"' and jour='"+jrr+"' and  H_DEB between '" +
                        deb +"' and '" + fin +"' and H_FIN between '" + deb +"' and '" + fin +"'"
    PS:
    si le nombre de lignes = 0 condition vérifiée sinon condition non vérifiée.

    Merci d'avance pour vos réponses.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    transformez votre condition "and" entre les 2 tests d'heure par un "OR" et encadrez tout ceci avec des parenthèses.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,
    Quels sont les types de tes colonnes, et quelles données mets tu dedans?

    Quelle est la requête exacte que tu executes, (le résultat de tes concaténation)?

    Quel est ton SGBD?
    a+
    Soazig

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Par défaut
    Citation Envoyé par punkoff Voir le message
    bonjour,

    transformez votre condition "and" entre les 2 tests d'heure par un "OR" et encadrez tout ceci avec des parenthèses.
    Heyyy PunKof

    il s'agit bien d'un OR puisque j'ai entamé la négation tout de même il y'a un petit problème, à l'insertion d'une ligne avec hr_debut=8h et hr_fin=10h (ça marche :la ligne est insérée dans la table )
    Or lorsque je désire insérer une autre ligne avec hr_debut=10 et hr_fin=12
    il ne l'insère pas c'est comme si il y'a une erreur dans la condition between.
    Comment puis-je régler cette erreur ?

    PS : les deux lignes ont le même code_pers et le même jour

    Merci d'avance pour votre réponse

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Par défaut
    Citation Envoyé par soazig Voir le message
    Bonjour,
    Quels sont les types de tes colonnes, et quelles données mets tu dedans?

    Quelle est la requête exacte que tu executes, (le résultat de tes concaténation)?

    Quel est ton SGBD?
    a+
    Soazig
    Bonjour,

    les types de mes colonnes sont des varchar, les données sont issues des variables que j'ai déclaré dans mon programme JAVA.
    Rq : j'ai pas de problème de déclaration

    Sinon pour ta dernière question, j'utilise Oracle.

    Merci

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Corrigez moi si je me trompe :

    Vous lancez cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select count(*) 
    from horaire 
    where CODE_personne = +per+ and jour=+jrr+ and H_DEB between +deb+ 
    and +fin+ and H_FIN between +deb+ and +fin+
    si cette requête retourne 0 => vous fait l'insertion
    si cette requête retourne 1 => vous ne fait pas l'insertion


    Si on reprend votre exemple :
    1ere insertion en base :
    deb fin
    8 10

    2eme tentative d'insertion en base :
    deb fin
    10 12

    ici votre requête retournera effectivement 0 (donc insertion possible)

    Mais si on essai ceci :
    2eme tentative d'insertion en base :
    deb fin
    7 9

    Votre requête retournera aussi 0 !

    A tout bien réfléchir les prédicats between ne sont pas la meilleur solution.


    Concernant votre 2eme problème, avez vous une erreur SQL retournée ?
    Quelle est la définition de votre table ? (en particulier la PK ?)

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Par défaut
    Merci PunKoff
    Ouiiii bien vu l'utilisation de between n'est pas la bonne solution à mon problème.
    tout de même opter pour les opérateurs logique (<,>,<=,>=) nécessite un travail de réflexion.

    tu n'aurais pas par hasard 1 méthode simples sans passer par les opérateurs (parce que sinon ma requête sera trop longue à écrire :p).

    Rq :J'ai pas de problème avec ma table mon problème c'est avec le between.

    Merciii encore

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    tu n'as pas répondu à ma question sur le format de stockage des données. ni la requete exacte que tu envoie à ORACLE (met un point d'arret, un espion), nous on travaille en SQL.
    Si j'ai posé la question sur le format des données c'est que la chaine "8" n'est pas inférieure à la chaine "10", et donc tes comparaison avec between risque de foirer également.

    A+
    Soazig

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Par défaut
    désolé SoaziG,
    je croyais que tu partais loin du problème, j'ai oublié qu'il y a des personnes qui utilisent d'autres SGBD.

    pour la requête que j'envoie sur oracle c'est celle que j'ai cité lors de l'ouverture de la discussion.

    Que veux-tu dire avec format de stockage : les types attributs de ma table c'est ça ?

    sinon pour la comparaison Oracle n'a pas de problème de comparaison, j'ai essayé avec des requêtes simples.

    Merci

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,
    Le format de stockage demandé est qu'y a t-il dans tes colonnes, le résultat d'un select ou un jeu de test nous aiderait.
    Je pense qu'il y a un soucis de modélisation.
    Pour le fun lance les requetes suivantes sur ta base Oracle, peut-être comprendras-tu ce que je veux dire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select * from dual
    where '8' between '7' and '10';
     
    select * from dual
    where '8'<'10';
     
     
    select * from dual
    where '08' between '07' and '10';
     
    select * from dual
    where '08'<'10';
    Les deux premières ne devrait rien te renvoyer, les deux suivantes si.
    NB: la table dual est une table ORACLe qui doit toujours exister,et ne contenir qu'une ligne

    Concernant la requête que tu donnes dans ton premier post, il semble qu'elle contienne des concaténations avec des variable, j'avais l'impression peut -être à tord que tu construisait ta requête dans une chaine de caractère en java. et que cette chaine tu l'envoyait à oracle. et je te demandais donc le contenu de la variable chaine avant l'appel à la requête oracle.

    A+
    Soazig

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Par défaut
    Heyyy SoaziG,
    ceci est les résultats des requêtes que tu as mentionnées
    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
    23
    24
    25
    26
    27
    28
     
    SQL> SELECT * FROM dual
      2  WHERE '8' BETWEEN '7' AND '10';
     
    aucune ligne sélectionnée
     
    SQL>  
    SQL> SELECT * FROM dual
      2  WHERE '8'<'10';
     
    aucune ligne sélectionnée
     
    SQL>  
    SQL>  
    SQL> SELECT * FROM dual
      2  WHERE '08' BETWEEN '07' AND '10';
     
    D
    -
    X
     
    SQL>  
    SQL> SELECT * FROM dual
      2  WHERE '08'<'10';
     
    D
    -
    X
    à propos pour ta remarque, tu n'as pas tort, je construisais ma requête dans une chaine de caractère en java et je l'envoyais à oracle. Si tu veux je peux vous envoyer le code, mais je ne crois pas que ça soit nécessaire étant donné que je n'ai pas de problème de connexion avec ma base.

    PS : je n'ai pas compris l'utilité de la table dual ni celle des requêtes que tu as demandées de tester, pourrais-tu m'éclairer à ce sujet.

    Question : j'ai pas trouvé une solution 100% efficace à mon problème d'horaire il y'a toujours des exceptions, suis-je obligé de passer au PL-SQL ?

    Merci encore

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,
    L'utilité des requêtes que je t'ai demandé d'exécuter etait de démontrer que stocker des nombre dans des varchar risque de poser des problèmes lorsqu'on veut les comparer.
    La table dual est une table qui existe dans chaque base Oracle et qui est utilisée lorsqu'on veut faire des tests ou obtenir le résultat d'une fonction. Elle n'a qu'une seule ligne systématiquement.
    Essaie de comprendre les requêtes que je t'ai fait faire.

    J'insiste pour avoir le jeu de test comme précisé dans les règles du forum.
    As-tu une table avec toutes les heures possible, cela pourrait aider à résoudre ton problème.
    Cordialement
    Soazig

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Par défaut
    Heyy SoadiG

    Non je n'ai pas une table avec toutes les heures possibles, mais voilà une bonne idée, pourquoi je n'ai pas pensé à ça ?

    Juste à titre indicatif à la base ma table est vide et à chaque fois que j'ajoute une ligne elle sera comparée aux n-1 qui les précédent.

    Je crois que je vais opter pour ta solution celle d'ajouter une table que je vais nommer créneaux_horaires tout de même je veux bien résoudre ce problème de façon algorithmique parce que si dans mon cas le nombre de créneaux horaires est limité il se peut que dans d'autres cas j'aurais des horaires avec mn et seconde.

    Que penses-tu SoadiG ?

    A+

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,
    En considérant que le problème de comparaison auquel je pense n'en est pas un ou que les colonne h_deb et h_fin sont des entiers ou de type qui se compare facilement, ta question initiale devrait se résoudre par la requête suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT count(*) 
    FROM horaire 
    WHERE CODE_personne = +per+ AND jour=+jrr+ AND 
    	Not	(H_FIN<= +deb+ 
    			OR H_DEBUT >= +fin+
    		)
    C'est à dire que les créneaux déjà utilisés doivent être avant l'heure de début du nouveau créneau (leur date de fin<nouvelle heure de début)
    ou après l'heure de fin(leur date de début>=nouvelle heure de fin)
    Cordialement
    Soazig

Discussions similaires

  1. problème avec between date
    Par jeanpierre215 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/09/2010, 17h58
  2. problème avec between
    Par Paula15 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/09/2010, 14h33
  3. Problème de date avec between
    Par sebac dans le forum Access
    Réponses: 3
    Dernier message: 29/06/2007, 20h16
  4. Réponses: 4
    Dernier message: 13/02/2006, 18h58
  5. Problème avec Between dans un code
    Par Sendo dans le forum Access
    Réponses: 4
    Dernier message: 02/10/2005, 18h44

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