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 :

Requete SQL qui sur les jours de l'année


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Requete SQL qui sur les jours de l'année
    Bonjour Tout le monde
    Voila, depuis quelque temps je galère sur une requête sql qui m'emperche de continuer mon application.
    la requête consiste à extraire les informations qui ont dépassé 360jours entre deux date, exemple : extraire le nom des personnes qui ont travaillé plus de 360j entre deux date jj/mm/aa.
    Merci d'avance pour votre aide

  2. #2
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    Pas évident de répondre sans la structure des tables concernées, mais on va quand même commencer par ça si ça peut t'aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT NomPersonne, COUNT(*) 
    FROM TableJourTravaille 
    WHERE DateTravail BETWEEN '01/01/2010' AND '31/12/2011'
    GROUP BY NomPersonne
    HAVING COUNT(*) > 360

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par SQLDev Voir le message
    Bonjour,

    Pas évident de répondre sans la structure des tables concernées, mais on va quand même commencer par ça si ça peut t'aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT NomPersonne, COUNT(*) 
    FROM TableJourTravaille 
    WHERE DateTravail BETWEEN '01/01/2010' AND '31/12/2011'
    GROUP BY NomPersonne
    HAVING COUNT(*) > 360
    Bonsoir
    D'abord,merci pour ta réponse qui ma vraiment orienté.
    si non avant, je t'explique ma structure plus précisément.
    en fait j'ai trois colonnes Numero d'agent,numero du billet,et la date du billet.
    mon pb est d'extraire tous les billets qui ont dépassé 360jours.
    après j ai essayer ta solution qui ma semblais très plausible, mais j obtiens des résultat totalement faut.
    j ai fouiné un peu sur le net est tout le monde m'orientait vers la fonction datdiff mais la je bloc toujours.
    Merci encore pour ton aide

  4. #4
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 81
    Points : 145
    Points
    145
    Par défaut
    Bonjour,

    Peut-être quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT   NomPersonne
    	,NoBillet
    	,DateBillet
     
     
     
    FROM    TableBillets
     
    WHERE   (CONVERT(NVARCHAR(10), DateBillet, 121) >= CONVERT(NVARCHAR(10), GETDATE() - 360, 121))
    Sachant que le 121 correspond à un format de date. Pour plus d'infos à ce sujet vous pouvez visiter http://msdn.microsoft.com/en-us/library/ms187928.aspx.

    En espérant avoir pu aider un poil

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Vu les précisions apportées par dexter2 sur le modèle de données, la table TableBillets ne contient pas les jours travaillés mais les billets par jour.

    La requête de SQLDEV est bonne, il faut simplement lui ajouter un distinct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT NomPersonne, COUNT(DISTINCT DateBillet) 
    FROM TableBillets 
    WHERE DateBillet BETWEEN '01/01/2010' AND '31/12/2011'
    GROUP BY NomPersonne
    HAVING COUNT(DISTINCT DateBillet) > 360
    Swiss_GaGGy, votre requête sort les billets traités dans les 360 derniers jours à compter d'aujourd'hui et je ne crois que ce soit ce qui est souhaité.

    edit : DateBillet doit être typé Date, il faut caster les littéraux du BETWEEN .

  6. #6
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 81
    Points : 145
    Points
    145
    Par défaut
    Re-bonjour,

    Si j'ai bien compris les pré-requis de Dexter2, il veut lister tous les billets ayant plus de 360 jours.
    Sa requête doit être évolutive et tenir compte chaque jour de l'âge des billets concernés.
    Cela implique, AMHA, qu'il doit "automatiser" la comparaison entre la date du jour et la date de création du billet vu qu'un billlet qui avait 359 jours hier en aura 360 aujourd'hui.

    De ce fait, je pense que la requête que j'avais proposée n'est pas si loin de la réalité des besoins de Dexter2.

    Maintenant, j'ai peut-être mal compris et il ne veut effectivement que compter lesdits billets auquel cas il devra forcément s'orienter vers un COUNT.
    Reste que je ne pense pas que "coder" les dates en dur dans la requête soit vraiment judicieux.

    De plus, il ne s'agit là que d'un exemple donnant une éventuelle piste à suivre

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par vmolines Voir le message
    Vu les précisions apportées par dexter2 sur le modèle de données, la table TableBillets ne contient pas les jours travaillés mais les billets par jour.

    La requête de SQLDEV est bonne, il faut simplement lui ajouter un distinct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT NomPersonne, COUNT(DISTINCT DateBillet) 
    FROM TableBillets 
    WHERE DateBillet BETWEEN '01/01/2010' AND '31/12/2011'
    GROUP BY NomPersonne
    HAVING COUNT(DISTINCT DateBillet) > 360
    Swiss_GaGGy, votre requête sort les billets traités dans les 360 derniers jours à compter d'aujourd'hui et je ne crois que ce soit ce qui est souhaité.

    edit : DateBillet doit être typé Date, il faut caster les littéraux du BETWEEN .

    Bonjour
    Voila j ai essayé toutes les suggestions que vous m'avait envoyé mais toujours des résultats faux, mais merci quand meme de votre orientation je v continuer à chercher sur le net

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Swiss_GaGGy Voir le message
    Bonjour,

    Peut-être quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT   NomPersonne
    	,NoBillet
    	,DateBillet
     
     
     
    FROM    TableBillets
     
    WHERE   (CONVERT(NVARCHAR(10), DateBillet, 121) >= CONVERT(NVARCHAR(10), GETDATE() - 360, 121))
    Sachant que le 121 correspond à un format de date. Pour plus d'infos à ce sujet vous pouvez visiter http://msdn.microsoft.com/en-us/library/ms187928.aspx.

    En espérant avoir pu aider un poil
    bonjour
    voila j ai testé cette requête est le résultat est proche du juste, mais ce que je n est pas vraiment compris c'est le num 121 et dans la requete même si je change 360 par n'importe quel num je reçois les mêmes résultats ce qui n est pas logique non??
    Merci encore de votre aide

  9. #9
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Une requête avec DATEDIFF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT    NomPersonne
    	, NoBillet
    	, DateBillet
    FROM TableBillet
    WHERE DATEDIFF(DAY, DateBillet, GETDATE()) > 360
    Il faut que le type de la colonne "DateBillet" soit en DATETIME.
    Sinon comme le souligne Swiss_GaGGy il faudra utiliser la fonction de conversion CONVERT pour DateBillet et GETDATE().

  10. #10
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 81
    Points : 145
    Points
    145
    Par défaut
    Citation Envoyé par vmolines Voir le message

    Swiss_GaGGy, votre requête sort les billets traités dans les 360 derniers jours à compter d'aujourd'hui et je ne crois que ce soit ce qui est souhaité.
    .
    Autant pour moi
    Le Code devrait plutôt être quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT   NomPersonne
    	,NoBillet
    	,DateBillet
     
     
     
    FROM    TableBillets
     
    WHERE   (CONVERT(NVARCHAR(10), DateBillet, 121) <= /* et non pas >= */  CONVERT(NVARCHAR(10), GETDATE() - 360, 121))
    Désolé pour cette faute de frappe impardonnable

    Dans le cas de cette requête il ne traitera que les billets ayant plus de 360 jours ( Sauf erreur de ma part )

  11. #11
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Swiss_GaGGy Voir le message
    Autant pour moi
    Le Code devrait plutôt être quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT   NomPersonne
    	,NoBillet
    	,DateBillet
     
     
     
    FROM    TableBillets
     
    WHERE   (CONVERT(NVARCHAR(10), DateBillet, 121) <= /* et non pas >= */  CONVERT(NVARCHAR(10), GETDATE() - 360, 121))




    Désolé pour cette faute de frappe impardonnable

    Dans le cas de cette requête il ne traitera que les billets ayant plus de 360 jours ( Sauf erreur de ma part )

    Bonjour,
    merci pour la petite correction qui a vraiment changé le résultat, et qui me semble correcte a première vue, mais ce qui m'intrigue, c est le fait que meme si je change le nombre 360 par n importe quel num le résultat est le même alors que logiquement il devait extraire plus de donnée si par exemple je tape 50, mais là le résultat reste identique.
    merci beaucoup pour ton aide swiss

  12. #12
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 81
    Points : 145
    Points
    145
    Par défaut
    Bonjour,

    Cela est quelque peu étonnant car si vous exécutez seulement la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT CONVERT(NVARCHAR(10), GETDATE() - 730, 121)
    Cela vous retournera la date : "2010-04-13"

    alors qu'en exécutant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT CONVERT(NVARCHAR(10), GETDATE() - 365, 121)
    Vous obtiendrez "2011-04-13"
    Pour vérifier si vos résultats reste toujours les mêmes vous pourriez "compter" les résultats en fonction du nombre de jours que vous indiquez.
    Cela donnerait un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT  count(NoBillet)
     
    FROM    TableBillets
     
    WHERE   (CONVERT(NVARCHAR(10), DateBillet, 121) <= /* et non pas >= */  CONVERT(NVARCHAR(10), GETDATE() - 360, 121))
    Exécutez ce code en jouant sur la valeur "nombre de jours" (ici 360) et vous verrez si le nombre de billets ouverts change ou non. En principe il devrait.

  13. #13
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Swiss_GaGGy Voir le message
    Bonjour,

    Cela est quelque peu étonnant car si vous exécutez seulement la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT CONVERT(NVARCHAR(10), GETDATE() - 730, 121)
    Cela vous retournera la date : "2010-04-13"

    alors qu'en exécutant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT CONVERT(NVARCHAR(10), GETDATE() - 365, 121)
    Vous obtiendrez "2011-04-13"
    Pour vérifier si vos résultats reste toujours les mêmes vous pourriez "compter" les résultats en fonction du nombre de jours que vous indiquez.
    Cela donnerait un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT  count(NoBillet)
     
    FROM    TableBillets
     
    WHERE   (CONVERT(NVARCHAR(10), DateBillet, 121) <= /* et non pas >= */  CONVERT(NVARCHAR(10), GETDATE() - 360, 121))
    Exécutez ce code en jouant sur la valeur "nombre de jours" (ici 360) et vous verrez si le nombre de billets ouverts change ou non. En principe il devrait.
    Bonjour
    je pense que la requête est plutôt juste,maintenant reste quelque réglage sinon vraiment merci pour ton aide précieux

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

Discussions similaires

  1. [Joomla!] Retrouver la requete SQL qui affiche les modules dans la zone admin
    Par vladock dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 04/10/2012, 12h12
  2. Requete SQL calcule sur les colonnes
    Par rose-rose dans le forum SQL Procédural
    Réponses: 10
    Dernier message: 19/05/2011, 09h47
  3. Requete Sql update sur les valeurs
    Par malayika dans le forum Requêtes
    Réponses: 4
    Dernier message: 03/07/2010, 13h48
  4. Réponses: 10
    Dernier message: 27/05/2010, 16h53

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