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

Développement SQL Server Discussion :

[SQL SRV][DEBUTANT]Aide sur une requete


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 5
    Points
    5
    Par défaut [SQL SRV][DEBUTANT]Aide sur une requete
    Bonjour,

    J'ai quelques bonnes notions en développement PHP, mais de gros souci avec les requêtes "complexes" sous SQL Server 2005.

    Ma table simplifiée : clients et dates.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT  
    MaTable.client
    ,MaTable.date
    FROM MaTable
    WHERE 
    MaTable.client = 'LE CLIENT'
    AND 
    MaTable.date Between '24/01/2011' And '26/01/2011'
    Jusqu'ici tout va bien,
    Je récupère tout les évènements de la journée du 24 et du 25.

    Maintenant, je souhaiterais ne garder que les évènements compris entre 2 heures
    et si je rajoute un malheureux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AND
    MaTable.date Between '07:30' And '15:00'
    Plus aucun résultat ...


    Alors, Je l'ai tourné en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaTable.date > '07:30' And MaTable.date < '15:00'
    Mais pareil...

    Entre 2, un petit espoir en voyant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AND
    DATEPART(hh,MaTable.date ) Between 7 AND 20
    qui se met finalement à me retourner des résultats... mais pas assez précis... il me faut un 07:30 et non un 07:00

    Je tente finalement en vain :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATE_FORMAT(MaTable.date, '%Hh%imin') Between '07:30' AND '20:00'
    mais la fonction DATE_FORMAT n'est pas reconnue...

    Je ne sais plus ...
    Le DATEPART pourrais me permettre d'extraire les heures puis les minutes ... une concaténation du genre heure+':'+minute et je pourrais lancer une comparaison, mais comment faire ceci?

    Je vois également qu'il est possible d'imbriquer des requêtes.
    dans les exemples ça marche toujours très bien, mais des que j'essaie ca se solde tout le temps par une erreur...

    Je suis quelque peu perdu!
    et les yeux qui piquent!!

    Plizz Help!

  2. #2
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    AND
    MaTable.date BETWEEN '07:30' AND '15:00'
    Normal que celà ne fonctionne pas puisque .date est une date avec heure... vous le comparez à des caractères donc SQL SERVER ne peut pas deviner que vous ne cherchez que l'heure mais je pense que vous l'aviez bien compris:

    AND
    DATEPART(hh,MaTable.date ) BETWEEN 7 AND 20
    (Sachez que DATEPART(hour,...) fait la même chose)
    Vous pouvez simplement affiner avec DATEPART(minute,MaTable.date)... pour extraire les minutes.
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Effectivement, j'ai bien compris que le DATEPART permettait de détailler la date,
    Mais je ne vois pas comment formuler la requête pour faire la comparaison?

    je vois 2 options :
    - Soit je compare séparément:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Heure BETWEEN heure1 AND heure2
    AND
    min BETWEEN min1 AND min2
    Mais sincèrement je ne l'ai pas testée car ca va obligatoirement sortir n'importe quoi...!

    - Comparer simultanément, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATEPART(hh, MaTable.date)+':'+DATEPART(hh, MaTable.date) BETWEEN '07:30' AND '20:00'
    là j'avoue j'ai testé!
    et ca me sort une jolie erreur de type.

    J'ai donc 'casté' tout ca du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CAST(DATEPART(...))+...
    Mais évidemment rien n'est sorti!

    ... et c'est en écrivant ce post que je me suis dit :
    Tu as casté vers le varchar ... pourquoi pas tenter dans l'autre sens?

    et la ... miracle!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (DATEPART(hh,MaTable.date)+(DATEPART( mi,MaTable.date )/100)) Between 5 AND 5
    et bien ca marche!

    Je m'explique
    dans la requete, J'additionne l'heure avec les minutes/100, ca me fait donc un chiffre qui va aller de 0 à 23.59

    Mais oui! entre 5 et 5 ... il me trouve des résultats! Bug?

    Comment de 5.00 jusqu’à 5.59, SQL peut-il dire que c'est entre 5 et 5...??
    --> seule réponse que je vois c'est qu'il l'a rangé par ordre alphabétique??

    ...et avant il m'embêtait avec une histoire de type?!!

    Enfin bon, plus qu'a retoucher le petit bug avec un peu de code derrière mais ca va largement me faciliter la tache.

    Comme quoi, merci pour ton intervention iberserk

    code complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  
    MaTable.client
    ,MaTable.date
    FROM MaTable
    WHERE 
    MaTable.client = 'LE CLIENT'
    AND 
    MaTable.date BETWEEN '24/01/2011' AND '26/01/2011'
    AND
    (DATEPART(hh,MaTable.date)+(DATEPART( mi,MaTable.date )/100)) Between 5 AND 5

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Ta solution me parait incompréhensible et hasardeuse !

    Ci-dessous une solution utilisant la notation normalisée ISO8601 :
    aaaa-mm-jjThh:mi:ss.mmm

    Exemple : Evennements entre 07:30 et 15:00

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .... 
    AND  ( CONVERT(DATETIME, CONVERT(CHAR(12), MaTable.date , 114), 114)
           BETWEEN '1900-01-01T07:30:00.000' AND  '1900-01-01T15:00:00.000' )
    Remarque : char(12) est utilisé pour le format de conversion 114 , c.à.d hh:mi:ss:mmm (sur 24h)
    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  5. #5
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    (DATEPART(hh,MaTable.date)+(DATEPART( mi,MaTable.date )/100)) BETWEEN 5 AND 5

    Le problème viens du fais que tu divises... d'où forcement problème d'arrondies.

    En restant en seconde (heures*60+ secondes) tu n'aurais pas eu le soucis...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Citation Envoyé par DF4ze Voir le message
    Je m'explique
    dans la requete, J'additionne l'heure avec les minutes/100, ca me fait donc un chiffre qui va aller de 0 à 23.59

    Mais oui! entre 5 et 5 ... il me trouve des résultats! Bug?

    Comment de 5.00 jusqu’à 5.59, SQL peut-il dire que c'est entre 5 et 5...??
    --> seule réponse que je vois c'est qu'il l'a rangé par ordre alphabétique??
    Non, ce n'est pas un bug. Comme l'a dit Ibersek, cela vient de ta division. DATEPART te retourne un INT. Appliqué sur les minutes, ca donne un entier inférieur à 60, que tu divise par 100. Cela te donne donc 0 !

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DECLARE @i int
    SET @i = 59
     
    SELECT @i/100
    --> 0



    Tes colonnes sont de type DATETIME ? utilise les fonctions date !

    Code SQL : 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
     
    SELECT  
    	MaTable.client
    	,MaTable.date
    FROM MaTable
    WHERE 
    	MaTable.client = 'LE CLIENT'
    	AND MaTable.date BETWEEN '24/01/2011 7:30' 
    					AND '25/01/2011 15:00'
    	AND DATEDIFF(
    			SECOND,
    			DATEADD(
    				DAY,
    				DATEDIFF(
    					DAY,
    					0,
    					MaTable.date
    				),
    				0
    			),
    			MaTable.date
    		)
    		BETWEEN  DATEDIFF(SECOND, 0, '7:30')
    		AND		DATEDIFF(SECOND, 0, '15:00')

Discussions similaires

  1. Besoin d'aide sur une requete sql
    Par Neo57 dans le forum Requêtes
    Réponses: 5
    Dernier message: 13/01/2010, 15h43
  2. Aide sur une requete SQL
    Par NABIL74 dans le forum Bases de données
    Réponses: 6
    Dernier message: 17/12/2008, 18h25
  3. aide sur une requete sql
    Par digger dans le forum Langage SQL
    Réponses: 1
    Dernier message: 23/11/2006, 17h19
  4. [SQL Server] Une petite aide sur une requete
    Par irenee dans le forum Langage SQL
    Réponses: 9
    Dernier message: 24/04/2006, 16h08
  5. [Debutant] Aide sur une requete normée
    Par Wisefool dans le forum Oracle
    Réponses: 2
    Dernier message: 14/04/2006, 18h41

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