2010-10-04 1 views
1

alt textBesoin d'aide dans le calcul des heures de travail

La façon dont je ma feuille de conçu travail ne me permet pas de calculer les heures de travail facilement.

La sortie dans l'instantané a été collectée à partir de plusieurs tables. Ne vous inquiétez pas de la mise en forme setDate et timeEntered.

SetDate représente la journée de travail. tsTypeTitle représente le type de décalage, est-ce l'heure du déjeuner, etc. timeEntered représente l'heure réelle.

setDate devra être rogné pour avoir seulement Date et timeEntered ne devrait afficher que l'heure - Cela sera traité plus tard, ne vous inquiétez pas à ce sujet.

J'ai besoin de saisir la différence entre Shift Started et Shift Ended afin que je puisse calculer le salaire.

Voici ma requête si vous voulez regarder:

SELECT TimeSheet.setDate, TimeSheetType.tsTypeTitle, TimeSheetDetail.timeEntered 
FROM TimeSheet 
    INNER JOIN TimeSheetDetail 
     ON TimeSheet.timeSheetID = TimeSheetDetail.timeSheetID 
    INNER JOIN TimeSheetType 
     ON TimeSheetType.timeSheetTypeID = TimeSheetDetail.timeSheetTypeID 
+0

Je me souviens dans la mise en œuvre de cette compagnie d'assurance que je travaillais avant .... mais le calcul n'a pas été fait dans des procédures stockées SQL en tant que politique de l'entreprise (par exemple 30 minutes obligatoires lunch) a dû être récupéré d'une autre table SQL d'un autre serveur. –

Répondre

1

En supposant tout le monde a les mêmes 4 événements (décalage de début/fin, début/fin déjeuner) tous les jours, vous pouvez faire quelque chose comme ce. Évidemment, j'ai fait des hypothèses pour vos valeurs TimeSheetType ID. Substituez les ID appropriés dans votre version.

SELECT t.TimeSheetID, DATEDIFF(HOUR, tsd1.timeEntered, tsd4.timeEntered) - DATEDIFF(HOUR, tsd2.timeEntered, tsd3.timeEntered) as WorkingHours 
    FROM TimeSheet t 
     INNER JOIN TimeSheetDetail tsd1 
      ON t.timeSheetID = tsd1.timeSheetID 
       and tsd1.timeSheetTypeID = 1 /* Shift Started */ 
     INNER JOIN TimeSheetDetail tsd2 
      ON t.timeSheetID = tsd2.timeSheetID 
       and tsd2.timeSheetTypeID = 2 /* Lunch Started */ 
     INNER JOIN TimeSheetDetail tsd3 
      ON t.timeSheetID = tsd3.timeSheetID 
       and tsd3.timeSheetTypeID = 3 /* Lunch Ended */ 
     INNER JOIN TimeSheetDetail tsd4 
      ON t.timeSheetID = tsd4.timeSheetID 
       and tsd4.timeSheetTypeID = 4 /* Shift Ended */ 
+0

Solution intelligente ...... – user311509

1

Si vous devez le faire dans la base de données, je suggère d'écrire une procédure stockée pour calculer les heures travaillées. Sinon, je pense qu'il est plus sage de gérer ce type de logique métier en dehors de la base de données, comme dans l'application qui se connecte à votre base de données.

En regardant le dessin que vous avez fourni, il vous manque un identifiant unique pour un utilisateur ou une personne qui correspond aux données de la feuille de temps stockées. Un identifiant unique est nécessaire, même si vous ne stockez actuellement que des données pour un utilisateur/une personne. Si vous avez besoin de stocker des données pour un plus grand nombre d'utilisateurs/de personnes, un identifiant unique vous permettra de le faire.

0

Les tables de détails de feuille de temps incluent normalement un ID de personne. Je suppose que cela a été omis, par souci de simplicité. En supposant que pour un jour donné, il y aura toujours un et un seul événement pour chacun des groupes suivants: Maj mis en marche, Déjeuner démarré, Déjeuner terminé et Maj terminé (dans cet ordre), ce déjeuner devrait être exclu du nombre total d'heures et il n'y a pas d'autres types d'événements, essayez:

with 
(SELECT TimeSheet.setDate, 
     TimeSheetType.tsTypeTitle, 
     TimeSheetDetail.timeEntered, 
     convert(datetime,convert(varchar(10),TimeSheetDetail.timeEntered,112),112) dayEntered 
FROM TimeSheet 
    INNER JOIN TimeSheetDetail 
     ON TimeSheet.timeSheetID = TimeSheetDetail.timeSheetID 
    INNER JOIN TimeSheetType 
     ON TimeSheetType.timeSheetTypeID = TimeSheetDetail.timeSheetTypeID) 
as TS 
select dayEntered, 
     datediff(ss,max(case when tsTypeTitle = 'Shift Started' then timeEntered end), 
        max(case when tsTypeTitle = 'Shift Ended' then timeEntered end)) - 
     datediff(ss,max(case when tsTypeTitle = 'Lunch Started' then timeEntered end), 
        max(case when tsTypeTitle = 'Lunch Ended' then timeEntered end)) daysSeconds 
from TS 
group by dayEntered 
+0

Merci pour votre aide! ... – user311509