MSSQL Problem

bilelwebdev -  
mjmdurand Messages postés 246 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

24 réponses

nicocole
 
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   Statut Membre Dernière intervention   44
 
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
bilelwebdev
 
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   Statut Membre Dernière intervention   44
 
ah en mssql, c'est pas en mysql plutot ?
0
bilelwebdev
 
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   Statut Membre Dernière intervention   44 > bilelwebdev
 
T-SQl pour une MS SQL (microsoft SQL)
0
nicocole
 
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
bilelwebdev
 
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   Statut Membre Dernière intervention   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
bilelwebdev
 
oui, MSSQL retourne ce format par défaut.
0
nicocole
 
tu fais un getDate et tu récupére heures, minutes et secondes : https://www.php.net/manual/fr/function.getdate.php
0
bilelwebdev
 
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   Statut Membre Dernière intervention   44
 
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
nicocole
 
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
bilelwebdev
 
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
nicocole
 
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   Statut Membre Dernière intervention   44
 
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
bilelwebdev
 
Le format de base via l'interface web est: Aug 7 2008 7:47AM
0
mjmdurand Messages postés 246 Date d'inscription   Statut Membre Dernière intervention   44
 
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
bilelwebdev
 
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   Statut Membre Dernière intervention   44
 
ou sinon, crée une autre table vu que tu ne peut pas la modifier. lol !
0
nicocole
 
Je ferais :

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

$date = $tab1[1]." ".$tab2[1]."-".$tab2[2]."-".$tab2[0];
0
nicocole
 
idem que mjmdurand :D :s
0
mjmdurand Messages postés 246 Date d'inscription   Statut Membre Dernière intervention   44
 
prem's ! lol
0
bilelwebdev
 
Merci vous deux, mes amis, demain je chercherais à trouver la solution en exploitant vos idées d'or.

avec tous mes respects.
0
nicocole
 
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   Statut Membre Dernière intervention   44
 
faudrait étudier le mssql je pense
0
bilelwebdev
 
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
nicocole
 
Je pense aussi ^^
0