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

Langage SQL Discussion :

Calculer la somme des heures à partir d'un champ datetime


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut Calculer la somme des heures à partir d'un champ datetime
    Bonjour à tous,

    Voici le problème, je veux calculer la somme des heures travaillées par un employé / jour sachant qu'un employé utilise la pointeuse pour l'entrée/sortie, chaque fois qu'il pointe, le système insère dans la table correspondante: La date et l'heure de pointage dans un seul champ, l'action (Entrée/Sortie) et le nom de l'employé.

    Je veux donc trouver le nombre des heures travaillées par un tel employé.

    C'est uregent SVP.

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    ou bloques tu?
    as tu une ébauche de ta requete?

    Michel

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Je veux exécuter cette requête à partir d'un script PHP via un serveur MS SQL server, on peut appliquer la fonction SUM sur des entiers, mais comment peut-on calculer la somme des heures dans un champ datetime:exemple d'un enregistrement dat_rec:'2008-01-01 10:25:24.000', action;'entrée'

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Tes explications sont assez sommaires...
    L'un moins l'autre, multiplié par 24?

  5. #5
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Ill existe certaine fonction, pas forcément dans la norme mais sous MySQL
    tu as EXTRACT ou HOUR, qui doivent fonctionner

    et

    Pour SQL serveur tu as DATEPART ou HOUR

    ... Si j'ai retenu la leçon car je crois que j'en ai oublié au moins 1...

    [EDIT]
    le DATEDIFF pour soustraire une date en SQL serveur... ou SUBDATE en MySQL pour le retrait d'un intervalle à une date... ()


  6. #6
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Voici la table:
    EMP Date_Record Action
    ---------------------------------------------------
    Paul 2008-01-01 08:00:00 Entrée
    Paul 2008-01-01 09:30:00 Sortie
    Paul 2008-01-01 10:15:33 Entrée
    Paul 2008-01-01 17:00:00 Sortie

    Je veux calculer le nombre des heures travaillées par Paul le 01-01-2008

  7. #7
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Ah ben là, ça change tout.

    C'est plus marrant que si il faisait 8H 12H et 13H 17 H

  8. #8
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Voici la table:
    EMP Date_Record Action
    ---------------------------------------------------
    Paul 2008-01-01 08:00:00 Entrée
    Paul 2008-01-01 09:30:00 Sortie
    Paul 2008-01-01 10:15:33 Entrée
    Paul 2008-01-01 11:05:31 Sortie
    Paul 2008-01-01 13:17:02 Entrée
    Paul 2008-01-01 17:00:00 Sortie

    Je veux calculer le nombre des heures travaillées par Paul le 01-01-2008

    L'employé peut sortir lorsqu'il veut pendant la journée, le but donc de trouver le nombre des heures/jour travaillées par l'employé.

    J'ai besoin d'une aide sérieuse SVP.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bon, admettons que tu insères ces données dans une table 'matable' du type ('heure' de type date,'employe' de type VARCHAR2,'action' de type VARCHAR2).
    Pour récupérer le temps de travail en heure par employé et par jour, ça donne à peu près ça (sous Oracle 9.i, donc peut-être à adapter) :
    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
    29
    SELECT 
        journee as "Journée", 
        employe as "Employé", 
        sum((heure_sortie - heure_entree) * 24) AS "Temps de travail" 
    FROM
    (
        SELECT mt1.employe, mt1.journee, mt1.heure_entree, mt2.heure_sortie 
        FROM
              (SELECT DISTINCT 
                  heure AS heure_entree, 
                  employe, 
                  trunc(heure,'dd') AS journee, 
                  rank() OVER (PARTITION BY employe ORDER BY heure) AS rang 
               FROM matable WHERE action = 'Entrée'
              ) mt1
            INNER JOIN 
              (SELECT DISTINCT 
                  heure AS heure_sortie, 
                  employe, 
                  trunc(heure,'dd') AS journee, 
                  rank() OVER (PARTITION BY employe ORDER BY heure) AS rang 
               FROM matable WHERE action = 'Sortie'
              ) mt2
            ON mt1.employe = mt2.employe
            AND mt1.journee = mt2.journee
            AND mt1.rang = mt2.rang
    )
    GROUP BY journee, employe
    ORDER BY journee, employe
    Ca doit se compliquer un peu si les employés peuvent travailler de nuit... j'y ai pas trop refléchi, mais c'est déjà un début.

  10. #10
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Bon, admettons que tu insères ces données dans une table 'matable' du type ('heure' de type date,'employe' de type VARCHAR2,'action' de type VARCHAR2).
    Pour récupérer le temps de travail en heure par employé et par jour, ça donne à peu près ça (sous Oracle 9.i, donc peut-être à adapter) :
    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
    29
    SELECT 
        journee as "Journée", 
        employe as "Employé", 
        sum((heure_sortie - heure_entree) * 24) AS "Temps de travail" 
    FROM
    (
        SELECT mt1.employe, mt1.journee, mt1.heure_entree, mt2.heure_sortie 
        FROM
              (SELECT DISTINCT 
                  heure AS heure_entree, 
                  employe, 
                  trunc(heure,'dd') AS journee, 
                  rank() OVER (PARTITION BY employe ORDER BY heure) AS rang 
               FROM matable WHERE action = 'Entrée'
              ) mt1
            INNER JOIN 
              (SELECT DISTINCT 
                  heure AS heure_sortie, 
                  employe, 
                  trunc(heure,'dd') AS journee, 
                  rank() OVER (PARTITION BY employe ORDER BY heure) AS rang 
               FROM matable WHERE action = 'Sortie'
              ) mt2
            ON mt1.employe = mt2.employe
            AND mt1.journee = mt2.journee
            AND mt1.rang = mt2.rang
    )
    GROUP BY journee, employe
    ORDER BY journee, employe
    Ca doit se compliquer un peu si les employés peuvent travailler de nuit... j'y ai pas trop refléchi, mais c'est déjà un début.
    Merci pour votre réponse,
    mais le problème que la fonction SUM ne fonctionne pas sur des champs datetime (date_record est de type datetime) en MSSQL, j'ai déjà trouvé une solution en MySQL et PHP, mais la table MSSQL est liée à une BD système crée par un mécanisme de pointage, j'ai simplifié alors la structure de la table pour trouver la bonne requête.

  11. #11
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Votre facon de faire va vite vous compliquer la tache.
    En effet vous allez devoir filtrer les alternances 'Entrée' 'Sortie' (alors que normalement a 1 entrée correspond 1 sortie)

    Pour vous aider, voici une petite requete qui pourra vous etre utile

    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
     
    select 
       a.EMP,
       year(a.date_entree),
       month(a.date_entree),
       day(a.date_entree), 
       sum(datediff(mi,a.date_entree,a.date_sortie)) 
    from (
       select 
          a.EMP, 
          a.date_record as date_entree, 
          min(b.date_record) as date_sortie  
        from MATABLE a inner join MATABLE  b  on (a.EMP=b.EMP and a.action<>b.action and a.action='Entrée' and b.date_record>a.date_record)
       group by a.EMP, a.date_record) a
    group by a.EMP,year(a.date_entree),month(a.date_entree),day(a.date_entree)
    Je ne garantie rien quand a sa fonctionnalité mais vous voyez ce qu'il faut faire pour recuperer la sortie associée a l'entrée
    Bon courage

  12. #12
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour @Yanika_bzh,

    Qu'entends tu pars entrée, sortie, alternance, 1/1 ?

Discussions similaires

  1. calculer la somme des heures dans un état
    Par fahdmounkaila dans le forum WinDev
    Réponses: 3
    Dernier message: 10/08/2011, 15h53
  2. Calculer la somme des heures à partir d'un champ datetime
    Par bilel.amri dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 10/09/2008, 14h28
  3. [MySQL] N'afficher que l'heure à partir d'un champ 'DATETIME' ?
    Par bilou95 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 14/03/2007, 15h00
  4. [newbie]comment calculer la somme des nb pages sum()?
    Par megapacman dans le forum Débuter
    Réponses: 3
    Dernier message: 13/06/2006, 11h03
  5. [VBA-A] calcul du total des heures d'une période
    Par aibar dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/06/2006, 00h16

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