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

MS SQL Server Discussion :

Demande d'aide pour requete sql


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut Demande d'aide pour requete sql
    Bonjour, Je suis débutant en .net et surtout en sql.
    Dans une table je voudrais rechercher les lignes saisies dans la 7 ème heure.
    j'ai essayé avec cette requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT TOP (12) Operation_ID, Operation, Reference, Poids, Débit, Conformite, DateCreation, Plancontrole
    FROM TABLE_OPERATION 
    WHERE (DateCreation LIKE '%07%') 
    ORDER BY Operation_ID DESC
    Cette requete me donne les lignes ou DateCreation contient un 07, j'ai essayé d'ajouté les deux points
    (DateCreation LIKE '%07:__:%')
    mais ça ne fonctionne pas, il ne cherche pas les deux points ??
    DateCreation est au format "dd/mm/yyyy hh:mm:ss"
    Si vous pouvez m'aider, merci beaucoup.

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 421
    Points
    7 421
    Billets dans le blog
    1
    Par défaut
    Une date est une date, et n'a pas de format.

    C'est sa représentation sous forme de chaîne de caractères qui a un format.
    Et c'est contre-performant de travailler dessus.

    Il faut donc privilégier l'utilisation de la fonction datepart() qui permet d'extraire une partie d'une date, sous forme d'un entier.

    Il suffira donc de faire datepart(hour, madate) = 7

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Effectivement les dates ne sont pas des chaînes de caractères.
    Donc l'utilisation du prédicat LIKE est ici incorrecte.

    Vous pouvez utiliser la fonction DATEPART() comme vous l'a indiqué StringBuilder, mais cette requête ne pourra pas alors profiter d'un index sur la colonne DateCreation.
    Si vous ne cherchez que les lignes d'une journée pour lesquelles l'heure est 7, il vaut mieux écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT	TOP (12) Operation_ID, Operation, Reference, Poids, Débit, Conformite, DateCreation, Plancontrole
    FROM	dbo.TABLE_OPERATION 
    WHERE	DateCreation >= '20120829 07:00:00'
    AND	DateCreation < '20120829 0/:00:00'
    ORDER	BY Operation_ID DESC
    @++

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 421
    Points
    7 421
    Billets dans le blog
    1
    Par défaut
    C'est quoi le slash dans la seconde date (???)

    --- Hmmm... J'ai l'impression que le / étant au dessus du 8 sur le pavé numérique, c'est juste un 8 raté

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Bonjour à tous, et merci pour vos réponses.
    Suite à vos commentaires j'ai modifier ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE  (DATEPART(hour, DateCreation) >= '7') AND (DATEPART(hour, DateCreation) < '8')
    Ca l'air de fonctionner et ca me permet de récupérer les lignes correspondantes sur les derniers jours.
    Par contre, elsuket, peut tu mieux m'expliquer quand tu dit
    pourra pas profiter d'un index sur la colonne DateCreation
    .

  6. #6
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    la requête que Elsuket est Sargeable, donc plus optimisée (si tu poses les bons index) que tes DATEPART
    as-tu testé la requête de Elsuket ? c-a-d la requête ci-après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT	TOP (12) Operation_ID, Operation, Reference, Poids, Débit, Conformite, DateCreation, Plancontrole
    FROM	dbo.TABLE_OPERATION 
    WHERE	DateCreation >= '20120829 07:00:00'
    AND	DateCreation < '20120829 08:00:00'
    ORDER	BY Operation_ID DESC
    Pour en savoir plus sur la SARGeabilité lire ce billet

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 421
    Points
    7 421
    Billets dans le blog
    1
    Par défaut
    En même temps, s'il veut faire une requête sur datepart() pour tous les jours, et non le jour J, rien ne l'empêche d'indexer datepart(hour, ladate)

  8. #8
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par miikado Voir le message
    Par contre, elsuket, peut tu mieux m'expliquer quand tu dit
    .
    Pour se demander si on peut utiliser un index, le mieux est de comparer avec un dictionnaire.
    Si je dois chercher tous les mots compris entre 'inde' et 'indf' parce que je cherche un mot commençant par 'ind' (ici, l'équivalent du jour) et dont la 4ème lettre est un e, je peux utiliser mon dictionnaire en mode index facilement.
    Maintenant si je dois chercher tous les mots dont la 4ème lettre est un e ... Je vais être obligé de lire toute la liste des mots si je n'ai pour seul index que celui de l'ordre alphabétique (il me reste la possibilité de créer un index sur la 4ème lettre des mots).

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Oui j'ai tester, mais ca m'oblige à modifier le jour, car il faut que j'affiche les réponses des jours précédents.
    Ce n'est qu'une indication et à partir du résultat, ca permet de trouver rapidement les opérations concernées qui elles sont modifier dans un autre DGV.
    Merci

  10. #10
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 421
    Points
    7 421
    Billets dans le blog
    1
    Par défaut
    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
     
    create table visite
    (
    	vis_id int identity(1, 1) not null primary key,
    	cli_id int not null references client(cli_id),
    	vis_date datetime not null default getdate(),
    	vis_hour as datepart(hour, vis_date)
    );
     
    create index vis_idx_hour on visite(vis_hour);
     
    insert into visite (vis_date, cli_id) values ('2012-08-29 15:10:00', 1);
    insert into visite (vis_date, cli_id) values ('2012-08-29 15:20:00', 1);
    insert into visite (vis_date, cli_id) values ('2012-08-29 15:10:00', 2);
    insert into visite (vis_date, cli_id) values ('2012-08-29 16:10:00', 2);
     
    select vis_hour, COUNT(*)
    from visite
    group by vis_hour;
     
    select *
    from visite
    where vis_hour = 15;

    Regarde les plan d'exécution pour les deux requêtes, tu verras que l'index vis_idx_hour est parfaitement utilisé.

    -- Edit : Bon, mauvais exemple, sur la seconde requête, chez moi il n'utilise pas mon index. Mais j'imagine que c'est à cause du faible nombre de lignes.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Merci à tous pour l'aide et les explications, je pense que je peux me passer des index.
    A+

  12. #12
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    [code=sql]
    Regarde les plan d'exécution pour les deux requêtes, tu verras que l'index vis_idx_hour est parfaitement utilisé.
    -- Edit : Bon, mauvais exemple, sur la seconde requête, chez moi il n'utilise pas mon index. Mais j'imagine que c'est à cause du faible nombre de lignes.
    Pourquoi faire compliquer alors qu'on peut faire simple ?
    Créer un index sur une colonne calculée c'est bien si on n'a pas d'autres alternatives !
    Avec la table TABLE_OPERATION et la requête suivante,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT	TOP (12) Operation_ID, Operation, Reference, Poids, Débit, Conformite, DateCreation, Plancontrole
    FROM	dbo.TABLE_OPERATION 
    WHERE	DateCreation >= '20120829 07:00:00'
    AND	DateCreation < '20120829 08:00:00'
    On peut créer l'index suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX IX_OPERATION_DateCreation ON TABLE_OPERATION(DateCreation ) INCLUDE (Operation, Reference, Poids, Débit,Conformite, Plancontrole);
    puis vérifier si l'index est utilisé (operateur Index Seek) ou pas.

    Je suppose que la colonne Operation_ID est PRIMARY KEY.

  13. #13
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par miikado Voir le message
    Merci à tous pour l'aide et les explications, je pense que je peux me passer des index.
    A+
    Oui pour le moment tu peux te passer des index maintenant ! mais t'en aura besoin certainement lorsque la quantité de données dans la table sera significative !

  14. #14
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 421
    Points
    7 421
    Billets dans le blog
    1
    Par défaut
    Tout simplement parceque la demande, c'est de trouver les lignes qui ont l'heure renseignée à 7, et non pas celles qui ont la date du jour à 7 heure.

    Il veut par exemple connaître le nombre d'opérations heure par heure, sur l'ensemble du mois.

    Et donc ta requête fonctionnera pas du tout.

    Ou alors il faudra énumérer l'ensemble des intervalles 7:00:00 à 7:59:59 pour tous les jours du mois, et je doute fortement que ça apporte quoi que ce soir en termes de performances. Et je ne parle pas s'il désire faire son analyse sur les 5 dernières années.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    zinzineti:
    Effectivement, la colonne Operation_ID est PRIMARY KEY.
    puis vérifier si l'index est utilisé (operateur Index Seek) ou pas
    Par contre, comment vérifier si l'index est utilisé, au cas ou je voudrais utiliser les index.

    Autre chose, la taille de la base de donnée ne devrait pas géner puisque je ne prends que les 12 dernières lignes saisies ?.

  16. #16
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Attention, TOP 12 signifie que SQL Server ne va ramener que les 12 premiers résultats retournés par la requête ... La taille de la table peut donc être très importante s'il n'y a pas d'index qui permette de trouver rapidement ces éléments - pour reprendre l'exemple du dictionnaire, si la condition c'est d'avoir 'z' en 4ème position, il y a bien des chances pour qu'il faille aller très loin dans le dictionnaire avant d'avoir trouvé 12 mots

    Pour savoir si l'index est utilisé, le plus simple est, en utilisant SQL Server Management Studio, de regarder le Plan d'exécution utilisé par la requête :cf par exemple ici pour des raccourcis.

  17. #17
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Ok, merci

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

Discussions similaires

  1. aide pour requete sql
    Par samplaid dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/07/2007, 12h18
  2. Besoin aide pour Requete SQL
    Par mystik11 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/07/2006, 11h34
  3. [OGS ?] Demande d'aide pour requete SQL
    Par hamtary dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/03/2006, 12h58
  4. Aide Pour Requete SQL Simple ... Merci d'avance :)
    Par thefutureisnow dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/12/2005, 11h39

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