MSSQL Problem

Fermé
bilelwebdev - 7 août 2008 à 16:03
mjmdurand Messages postés 246 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 27 juillet 2013 - 7 août 2008 à 17:22
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

24 réponses

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 :)
0
mjmdurand Messages postés 246 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 27 juillet 2013 44
7 août 2008 à 16:26
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
0
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.
0
mjmdurand Messages postés 246 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 27 juillet 2013 44
7 août 2008 à 16:33
ah en mssql, c'est pas en mysql plutot ?
0
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??
0
mjmdurand Messages postés 246 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 27 juillet 2013 44 > bilelwebdev
7 août 2008 à 17:19
T-SQl pour une MS SQL (microsoft SQL)
0
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
0
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????
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mjmdurand Messages postés 246 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 27 juillet 2013 44
7 août 2008 à 16:44
tu peut les avoir qu'au format YYYY-MM-JJ HH:MM:SS et pas au format HH:MM:SS MM-JJ-YYYY ?
0
oui, MSSQL retourne ce format par défaut.
0
tu fais un getDate et tu récupére heures, minutes et secondes : https://www.php.net/manual/fr/function.getdate.php
0
voici le format exacte retournée par MSSQL: 'Aug 7 2008 7:47AM'
getData retourne des minutes et des secondes nulles dans ce cas
0
mjmdurand Messages postés 246 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 27 juillet 2013 44
7 août 2008 à 16:49
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 ?
0
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
0
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'
0
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?
0
mjmdurand Messages postés 246 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 27 juillet 2013 44
7 août 2008 à 17:02
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
0
Le format de base via l'interface web est: Aug 7 2008 7:47AM
0
mjmdurand Messages postés 246 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 27 juillet 2013 44
7 août 2008 à 17:07
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 ?
0
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??
0
mjmdurand Messages postés 246 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 27 juillet 2013 44
7 août 2008 à 17:09
ou sinon, crée une autre table vu que tu ne peut pas la modifier. lol !
0
Je ferais :

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

$date = $tab1[1]." ".$tab2[1]."-".$tab2[2]."-".$tab2[0];
0
idem que mjmdurand :D :s
0
mjmdurand Messages postés 246 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 27 juillet 2013 44
7 août 2008 à 17:12
prem's ! lol
0
Merci vous deux, mes amis, demain je chercherais à trouver la solution en exploitant vos idées d'or.

avec tous mes respects.
0
Ouais ben je réitère ma proposition sauf qu'y faut faire des tests pour avoir le "AUG" et le "AM".... :s
0
mjmdurand Messages postés 246 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 27 juillet 2013 44
7 août 2008 à 17:14
faudrait étudier le mssql je pense
0
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
0
Je pense aussi ^^
0