4

私はこのようなデータベーステーブルを持っています:
ここに画像の説明を入力
私はこれをうまく説明できるといいのですが、あなたが理解できるように.

各従業員が何時間働いたかを計算したい。
たとえば、「Arjeta Domi」の場合、Cell(2,3) - Cell(3,3) + Cell(4,3) + Cell(5,3) となり、各 logOut 時間と Login 時間の差が生じます。

ここに画像の説明を入力

私が望む最終的なテーブルには、次の列があります: CardNo, UserName, Date, PauseTime,WorkTime

私はこのクエリを試しました:複製から取得

SELECT DISTINCT
  [Card NO], 
  [User Name],  
  (
    SELECT
      MIN(DateTime) AS [Enter Time], 
      MAX(DateTime) AS [Exit Time], 
      MAX(DateTime) - MIN(DateTime) AS [Inside Hours] 
    FROM
      ExcelData
  ) 
FROM
  ExcelData
GROUP BY
  [Card NO], [User Name], DateTime

DateTime列のタイプはStringではなくDateTimeです。MS Access データベースを使用しています。

4

2 に答える 2

2

DateTime を I として「m001-1-In」を含むすべての行を選択し、サブクエリを O としてこれに「m001-1-Exit」行を追加すると、次のようになります。

SELECT t1.[Card No], t1.[User Name],dateTime as I
,(Select TOP 1 dateTime from Tab t2 where  t2.[Card No]= t1.[Card No] 
and  t2.[User Name]= t1.[User Name] and  t2.Addr='m001-1-Exit' 
and t2.DateTime>t1.datetime ORDER by DateTime) as O
FROM Tab t1
where t1.Addr='m001-1-In' 

ここに画像の説明を入力

これを簡単にカプセル化し、下に Prepared として表示し、これに SUM と Grouping を追加します。

SELECT [Prepared].[Card No], [Prepared].[User Name], SUM(DateDiff('n',I,O))/60 AS Hours
FROM (
      SELECT t1.[Card No], t1.[User Name],dateTime as I
    ,(Select TOP 1 dateTime from Tab t2 where  t2.[Card No]= t1.[Card No] 
      and  t2.[User Name]= t1.[User Name] and  t2.Addr='m001-1-Exit' 
      and t2.DateTime>t1.datetime ORDER by DateTime) as O
FROM Tab t1
where t1.Addr='m001-1-In' 
)  AS [Prepared]
GROUP BY [Prepared].[Card No], [Prepared].[User Name]

DateRange を制限する必要がある場合は、必要な条件を行に追加しますwhere t1.Addr='m001-1-In'

于 2014-09-19T18:04:06.723 に答える