MSSQL Problem

Bonjour,
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.

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 de votre aide
Configuration: Windows XP
Internet Explorer 6.0

24 réponses

  • Votes
  • Date
  • Date décroissante
Résumé de la discussion

Le problème consiste à calculer la somme des heures travaillées par un employé pour une journée à partir des pointages entrée et sortie stockés dans une table. Parmi les solutions courantes, on peut agréger les paires entrée/sortie du même jour et additionner les durées calculées entre chaque entrée et sa sortie correspondante. Certaines solutions préconisent d'utiliser des fonctions SQL pour faire correspondre les entrées et sorties par jour, ou de stocker temporairement les enregistrements dans une structure intermédiaire et de totaliser les écarts. D'autres approches envisagent d'inclure les pauses pour obtenir les heures effectives et, en cas d'écarts anormaux, d'exclure les périodes hors plage de travail pour éviter les surcharges.

Bobot (l’IA à votre service)
  1. Salut,
    Perso, ce n'est peut-être pas la meilleure solution mais je stockerais tout ça dans un tableau et je bidouillerais avec des if()... et donc à grands coups de soustraction :)
    1. essaye de creer une table avec comme champs (minimum) id,nom,entrée,sortie,jour

      a chaque sortie, on insert le timestamp actuel (avec time() )dans la colone sortie
      a chaque entrée, on insert le timestamp actuel (avec time() )dans la colone entrée
      a chaque action (entrée ou sortie) on insert le timestamp actuel (avec time() )dans la colone jour

      apres, on va definir les dates de selection :

      pour cela, on utilise mktime qui se parametre comme ceci :

      mktime(heure,minute,seconde,mois,jour,annee)

      $matin= mktime(0, 0, 0, 2, 15, 2008);
      $soir= mktime(0, 0, 0, 2, 16, 2008);

      apres, on fait notre requete sql

      $retour='"SELECT *FROM "nom de table" WHERE jour BETWEEN '$matin' AND '$soir'");

      puis, on va effectuer les calculs

      while ($donnees=mysql_fetch_array($retour))
      {
      $entree=$entree+$donnees['entree'];
      $sortie=$sortie+$donnees['sortie'];

      }
      $temps_travail=$sortie - $entree;

      echo $donnees['nom'].' a travaillé '.date('H:i', $temps_travail);

      voila
      1. tout d'abord, merci par votre réponse,

        J'ai pensé à votre idée avant de déposer le problème sur le forum, tu sais pour quoi? car le DDL de la table est plus compliqué puisqu'elle est crée par un système automatique de pointage (on n'a pas l'accès à modifier la structure de la table), donc je cherche à trouver un solution en PHP/MSSQL pour résoudre ce problème,

        j'attends votre réponse.
    2. ah en mssql, c'est pas en mysql plutot ?
      1. oui c'est em mssql, mais peut être la solution c'est avec une requête SQL qui dépend pas de type de l'SGBD,non??
    3. Moi je ferais, pour chaque enregistrement :

      SI l'action est une sortie, tu prends la date de sortie et tu lui enlève la date d'entrée de l'enregistrement précédent
      tu incrémentes ça à ton total et tu boucles
      1. le problème, c'est comment additionner des dates au format 'YYYY-MM-JJ HH:MM:SS' pour trouver la somme des heures travaillées????
    4. tu peut les avoir qu'au format YYYY-MM-JJ HH:MM:SS et pas au format HH:MM:SS MM-JJ-YYYY ?
      1. oui, MSSQL retourne ce format par défaut.
    5. le probleme de getdate, c'est qu'ici, on ne peut pas obtenir de timestamp vu que le format n'est pas le bon.
      de plus, on obtiendrait les renseignement du timestamp actuel non ?
      1. Non si on fournit le parametre getdate($date), ça retourne les infos de $date.
        C'est vrai que c'est génant pour le format je n'avais pas fait gaffe....
        'Faut trouver un moyen de la formater....Mais comment? :s
        1. via l'interface php, MSSQL retourne un format comme ça:'Aug 7 2008 7:47AM' mais avec l'interface logiciel le format est 'YYYY-MM-JJ HH:MM:SS'
      2. Ben dans ce cas, je penses que tu dois faire plusieurs explode et faire une suite de tests pour récupérer les bonnes infos et les formater... Non?
        1. J'AI TROUVE !!!!!

          format de base : YYYY-MM-JJ HH:MM:SS
          format recherché : HH:MM:SS MM-JJ-YYYY

          on ignore les 10 premiers caracteres

          $debut=substr($date,10)

          on obtient donc HH:MM:SS

          $milieu=substr($date,-14,5 )

          on obtient donc MM-JJ

          $fin=substr($date,-19,4)

          on obtient donc YYYY

          $date=$debut.$milieu.'-'.$fin
          1. Le format de base via l'interface web est: Aug 7 2008 7:47AM
        2. je sais ! je m'en suis rendu compte apres avoir posté (car quand j'écrivais, je ne voyais pas les nouveaux messages)

          IL DOIT Y AVOIR UNE SOLUTION

          euhh... un crayon, du papier , une calculatrice, ca irait comme solution ?
          1. voici comme je fais pour retourner les enregistrements de la table système:
            function emp_sql_select()
            {
            global $conn, $_POST;
            if(!isset($_SESSION['lname']) && !isset($_SESSION['fname'])){
            $_SESSION['lname']=$_POST['lname'];
            $_SESSION['fname']=$_POST['fname'];
            }

            $sql = "SELECT REC_DAT,DESCRP,LOCATION,LNAME,FNAME FROM EV_LOG WHERE day(REC_DAT) = day(GETDATE()) and month(rec_dat) = month(GETDATE()) and year(rec_dat)=year(getdate()) and upper(LNAME)=upper('" .
            $_SESSION['lname'] . "') and upper(FNAME)=upper('" . $_SESSION['fname'] . "')";
            $res = mssql_query($sql, $conn);
            return $res;
            }
            on donne:$conn l'objet de connexion.
            Donc on doit traiter ceci:
            $res = emp_sql_select();
            $row = mssql_fetch_assoc($res);

            on doit alors traiter $row['REC_DAT'], comment faire alors pour résoudre le problème??
            1. ou sinon, crée une autre table vu que tu ne peut pas la modifier. lol !
              1. Je ferais :

                $tab1= explode(" ", $date);
                $tab2 = explode(":", $tab[0]);

                $date = $tab1[1]." ".$tab2[1]."-".$tab2[2]."-".$tab2[0];
                1. Merci vous deux, mes amis, demain je chercherais à trouver la solution en exploitant vos idées d'or.

                  avec tous mes respects.
                  1. Ouais ben je réitère ma proposition sauf qu'y faut faire des tests pour avoir le "AUG" et le "AM".... :s
                    1. faudrait étudier le mssql je pense
                      1. Pas de panic,

                        Vous savez que c'est pas la peine de casser la tête avec des solutions de truc qui commence par 'MIC' et se termine par 'SOFT', en mysql ça fonctionne très bien (retourne un nombre calculé avec la requete), boh, il faut trouver une solution
                    • 1
                    • 2