-2

従業員が午前 9 時から午後 18 時までに費やした合計時間を計算したいと考えています。

私のデータベースは次のようになります。

これどうやってするの??

AttendanceId     EmpId           CheckTime                  CheckType
-------------------------------------------------------------------------
   3               5             2013-01-03 09:00:15.000           1 (Login)
   4               5             2013-01-03 11:00:00.000           2 (Logout)
   5               5             2013-01-03 11:30:00.000           1 
   6               5             2013-01-03 13:00:00.000           2 
   7               5             2013-01-03 13:30:00.000           1 
   8               5             2013-01-03 16:00:00.000           2 
   9               5             2013-01-03 16:30:00.000           1 
  10               5             2013-01-03 18:00:00.000           2 
4

2 に答える 2

2

Login/Logout値は同じ列にあるため、最初にログイン/ログアウト時間を取得してから、従業員が存在する合計時間を決定する方が簡単な場合がありPIVOTますdatediff

クエリのPIVOT一部は次のとおりです。

select empid, [1], [2]
from
(
  select empid, checktime, checktype,
    row_number() over(partition by empid, checktype order by checktime) rn
  from yourtable
) src
pivot
(
  max(checktime)
  for checktype in ([1], [2])
) piv

デモで SQL Fiddle を参照してください

この結果は次のとおりです。

| EMPID |                              1 |                              2 |
---------------------------------------------------------------------------
|     5 | January, 03 2013 09:00:15+0000 | January, 03 2013 11:00:00+0000 |
|     5 | January, 03 2013 11:30:00+0000 | January, 03 2013 13:00:00+0000 |
|     5 | January, 03 2013 13:30:00+0000 | January, 03 2013 16:00:00+0000 |
|     5 | January, 03 2013 16:30:00+0000 | January, 03 2013 18:00:00+0000 |

データがこの構造になったら、DateDiff()関数を適用することで時間の差を簡単に取得できます。

従業員がログインしている時間を生成する最後のクエリは次のとおりです。

select empid, sum(SecondsDiff) / 3600 as TotalHours
from
(
  select empid, datediff(ss, [1], [2]) SecondsDiff
  from
  (
    select empid, checktime, checktype,
      row_number() over(partition by empid, checktype order by checktime) rn
    from yourtable
  ) src
  pivot
  (
    max(checktime)
    for checktype in ([1], [2])
  ) piv
) src
group by empid

デモで SQL Fiddle を参照してください

結果は次のとおりです。

| EMPID | TOTALHOURS |
----------------------
|     5 |          7 |
于 2013-01-04T16:57:36.760 に答える
0

2 つの日付の差を取得するには、次のDATEDIFF関数を使用します: http://msdn.microsoft.com/en-us/library/ms189794.aspx

ただし、これを行ごとに行う必要があると思います。テーブルの構造上、単純なクエリを実行することはできません。

于 2013-01-04T16:17:51.823 に答える