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 :

Requête : premiere heure d'une journée


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2010
    Messages : 34
    Points : 46
    Points
    46
    Par défaut Requête : premiere heure d'une journée
    Bonjours a tous,

    Je travail actuellement sur le dévellopement d'un logitiel de pointage pour mon entreprise. Les heures de pointage sont contenues dans une base SQLserver.
    La table event contient les colonnes :
    - numero (clée primaire de la table),
    - horodatage (heure et date du pointage)
    - info (identifiant du salarié).

    J'aurai besoin d'aide pour écrire la requête séléctionnant le premier pointage de la journée et le numero de ce pointage.

    J'ai deja pu faire la requête suivante qui fonctionne (elle sélectionne bien le premier pointage de la journée) mais elle ne permet pas de sélectionner en même temps le champs numero (ce que je voudrai faire) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT MIN(horodatage) 
    FROM event 
    WHERE info like '215641' 
    AND MONTH(horodatage)='2' 
    GROUP BY DAY(horodatage), MONTH(horodatage), YEAR(horodatage) 
    ORDER BY min(horodatage)
    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Etrange votre requête, vous avez quelques erreurs dedans.
    Vous avez trois solutions pour faire ce que vous voulez.

    La première, la plus simple à comprendre et qui fonctionne sur la plupart des SGBD, et de faire un sous-ensemble salarié / min, puis de le joindre au reste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT ev.info, ev.horodatage, ev.numero
      FROM event AS ev
           INNER JOIN 
            (
              SELECT info, MIN(horodatage) as horo_min
                FROM event 
               WHERE info = '215641' 
                 AND MONTH(horodatage) = 2
            GROUP BY info
            ) AS Imin
             ON Imin.info = ev.info
            AND Imin.horo_min = ev.horodatage
    La deuxième est de passer par une fonction de fenêtrage, row_number(), rank() ou dense_rank() selon vos souhaits, utilisables à partir de SQL Server 2005.
    Vous pouvez le combiner avec une CTE pour faciliter la lecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH Imin (info, horodatage, numero, rn) AS
    (
    SELECT info, horodatage, numero,
           row_number() over(partition by info order by horodatage asc) 
      FROM event 
     WHERE info = '215641' 
       AND MONTH(horodatage) = 2
    )
    select info, horodatage, numero
      from Imin
     where rn = 1;
    La dernière, plus asticieuse mais moins naturelle, consiste à transformer la date en chaîne de caractère "triable" et de jouer avec les concaténations / sous-chaînes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      SELECT info, MIN(horodatage) as horodatage,
             cast(right(min(convert(varchar, horodatage, 121) + cast(numero as char(10))), 10) as integer) as numero
        FROM event 
       WHERE info = '215641' 
         AND MONTH(horodatage) = 2
    GROUP BY info;

  3. #3
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2010
    Messages : 34
    Points : 46
    Points
    46
    Par défaut
    Merci Waldar, vos solutions marchent très bien à un petit détail près : je voudrai avoir un pointage par jour, c'est a dire la plus petite heure de la journée pour tous les jours d'un mois (février dans ce cas précis) donc une ligne par jours

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Il faut alors rajouter la colonne valant le jour d'horodatage dans les GROUP BY / PARTITION BY, SELECT et JOINTURE.

    Pour arrondir une journée avec données temps à la journée, il faut utiliser la formule suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select cast(floor(cast(getdate() as float)) as smalldatetime) as DATE_JOUR;
     
    DATE_JOUR
    -----------------------
    2010-02-15 00:00:00

  5. #5
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2010
    Messages : 34
    Points : 46
    Points
    46
    Par défaut
    Encore merci Waldar, j'ai bien le résultat que je souhaité.
    J'ai a peu prés compris le fonctionnement des trois solutions et pour le moment je pense utilisé la seconde requête avec la fonction de fenêtrage.

    Je ferai tout de même des test de performance avec les autres requêtes et vous direz le résultat de mes test.

    Merci pour tout.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Niveau performance je pense que c'est relativement équivalent.
    La dernière est peut-être plus rapide, mais si c'est le cas ce ne sera pas une énorme différence.
    Je préfère également la deuxième solution.

    J'ai oublié de préciser que si vous désirez travailler sur tous les jours calendaires, il vous faut une table calendrier qui vous le permettra via une jointure externe !

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

Discussions similaires

  1. inclure un format d'heure dans une requête
    Par marc majewski dans le forum Oracle
    Réponses: 4
    Dernier message: 29/06/2009, 16h00
  2. Comparer date/heure dans une requête SQL
    Par ach152 dans le forum Débuter
    Réponses: 9
    Dernier message: 13/07/2008, 14h24
  3. Calcul heure dans une requête
    Par Accessbeotien dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 07/09/2007, 10h12
  4. récupérer date et heure d'une requête
    Par taffMan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/02/2007, 13h55
  5. Réponses: 3
    Dernier message: 06/10/2006, 14h55

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