1
log_date    log_time           emp_id    emp_name          log_action       
2013-06-16  08:48:48.0000000    30170   Sarah John          1
2013-06-16  16:48:48.0000000    30170   Sarah John          4
2013-06-15  07:18:48.0000000    30160   Paula Fred          1
2013-06-15  16:38:48.0000000    30160   Paula Fred          4

上記の情報を含むログテーブルがあります。各従業員の毎日の勤務時間を計算し、別の 10 進数フィールドに格納するクエリがあります。問題は、分数がずれていることです。従業員が同じ日に複数回パンチイン/パンチアウトすると、時間が追加されます。最初の良いパンチイン/パンチアウトのみを考慮したいと思います。

Select DISTINCT emp_id,log_date,SUM(datediff(Minute,stm, etm))/60.0
  as wrk_hrs from
(
    SELECT
        emp_id, log_date,
        log_time as etm,
        (
            SELECT top 1 log_time
            FROM tblLogs
            WHERE log_action = '1' and log_time <= a.log_time and emp_id=a.emp_id and a.log_date=log_date order by log_time desc
        ) as stm
    FROM tblLogs as a
    WHERE log_action = '4'
)as a
where stm is not null
group by log_date,emp_id,a.stm,a.etm;

時間と分を計算し、さらに計算するために保存するより正確な方法はありますか。レポートには時間の経過と週ごとの合計時間が必要です。

4

3 に答える 3

0
SELECT StartLog.emp_id, StartLog.log_date,  SUM(datediff(Minute,stm, etm))/60.0
FROM (
    SELECT emp_id, log_date, MIN(log_time) AS stm 
    FROM tblLogs
    WHERE log_action = '1'
    GROUP BY emp_id, log_date
    ) AS StartLog
INNER JOIN 
    (
        SELECT emp_id, log_date, MIN(log_time) AS etm 
        FROM tblLogs
        WHERE log_action = '4'
        GROUP BY emp_id, log_date
    ) AS EndLog
    ON StartLog.emp_id = EndLog.emp_id AND StartLog.log_date = EndLog.log_date
于 2013-07-03T15:54:35.480 に答える
0

employee-day-action ごとに最初のエントリのみが必要なため、次のようにします。

SELECT
  [log_date],
  [emp_id],
  [emp_name],
  [1] AS [first_log_in],
  [4] AS [first_log_out],
  DATEDIFF(minute,[1],[4])/60.0 AS [hours]
FROM @tblLogs
PIVOT(MIN(log_time) FOR log_action IN ([1],[4])) p

これは、ログ データが良好な状態であることを前提としています。パンチアウト前のパンチアウトまたはパンチアウトの前に複数のパンチインをチェックする必要がある場合、それはまったく別の問題です。

于 2013-07-03T15:42:32.960 に答える
0

もっと精度が必要な場合は、秒に切り替えます。

Select emp_id,log_date,SUM(datediff(second,stm, etm))/3600.0
  as wrk_hrs from
(
    SELECT
        emp_id, log_date,
        log_time as etm,
        (
            SELECT top 1 log_time
            FROM tblLogs
            WHERE log_action = '1' and log_time <= a.log_time and emp_id=a.emp_id and a.log_date=log_date order by log_time desc
        ) as stm
    FROM tblLogs as a
    WHERE log_action = '4'
)as a
where stm is not null
group by log_date,emp_id,a.stm,a.etm;

注: distinctを使用する場合、通常は完全に冗長group byです。

于 2013-07-04T02:20:21.223 に答える