1


0

労働時間の計算に助けが必要

image:https://i.stack.imgur.com/hrddp.jpg [alt text]

作業シートを設計した方法では、労働時間を簡単に計算できません。

スナップショットの出力は、複数のテーブルから収集されています。

setDateとtimeEnteredのフォーマットについて心配する必要はありません。

SetDateは就業日を表します。 tsTypeTitleは、シフトのタイプ、昼食時間などを表します。 timeEnteredは実際の時間を表します。

setDateは、DateとtimeEnteredのみが時刻を表示するようにトリミングする必要があります-これは後で処理されますが、心配する必要はありません。

私は賃金を計算できるように、シフト開始とシフト終了の違いをつかむ必要があります。

あなたがそれを見たい場合の私のクエリは次のとおりです。

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

3 Answer


1


全員が毎日同じ4つのイベント(シフトの開始/終了、昼食の開始/終了)を持っていると仮定すると、このようなことができます。 明らかに、TimeSheetType IDの値を想定しています。 ご使用のバージョンの適切なIDに置き換えてください。

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 */


1


データベースでこれを行う必要がある場合は、作業時間を計算するストアドプロシージャを作成することをお勧めします。 そうでなければ、データベースに接続するアプリケーションのように、データベースの外部でこの種のビジネスロジックを処理する方が賢明だと思います。

提供されたデザインを見ると、保存されているタイムシートデータに対応するユーザーまたは個人の一意の識別子が欠落しているようです。 現在、単一のユーザー/個人のデータのみを保存している場合でも、一意の識別子が必要です。 より多くのユーザー/人のデータを保存する必要がある場合は、一意の識別子を持つことで可能になります。


0


通常、タイムシートの詳細テーブルには個人IDが含まれます。 簡単にするために、これは省略されていると思います。

ある特定の日には、シフト開始、ランチ開始、ランチ終了、シフト終了の各イベントが常に1つだけであると仮定すると(その順序で)、そのランチは合計時間から除外され、他のイベントはありませんタイプ、試してください:

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