2

人がオフィス内に何回滞在したかを示すためにクエリを実行する必要があります。私は、その人がオフィスに入るときの記録と、その人がオフィスを出るときの記録およびその他の記録を作成するリストを持っています。ある人が同じ日に何度も出入りでき、時には一人があなたの出入りを登録しないことがあるので、私はいくつかの困難を抱えています。例に従ってください

╔════════════╦════════════╦════════════════════╦═════════════════╦═════════╦═══════╗
║ Local Date ║ Local Time ║      Employee      ║     Office      ║ Catraca ║ Staus ║
╠════════════╬════════════╬════════════════════╬═════════════════╬═════════╬═══════╣
║ 11/7/2012  ║ 10:16      ║ SILVA ,ANDRE BRAGA ║ Alexandre Duma  ║     002 ║ In    ║
║ 11/7/2012  ║ 13:03      ║ SILVA ,ANDRE BRAGA ║ Alexandre Dumas ║     004 ║ Out   ║
║ 11/7/2012  ║ 15:19      ║ SILVA ,ANDRE BRAGA ║ Alexandre Dumas ║     004 ║ Out   ║
║ 11/7/2012  ║ 15:25      ║ SILVA ,ANDRE BRAGA ║ Alexandre Dumas ║     004 ║ In    ║
║ 11/7/2012  ║ 18:31      ║ SILVA ,ANDRE BRAGA ║ Alexandre Dumas ║     004 ║ Out   ║
║ 11/7/2012  ║ 18:40      ║ SILVA ,ANDRE BRAGA ║ Alexandre Dumas ║     004 ║ In    ║
║ 11/7/2012  ║ 19:56      ║ SILVA ,ANDRE BRAGA ║ Alexandre Dumas ║     004 ║ Out   ║
╚════════════╩════════════╩════════════════════╩═════════════════╩═════════╩═══════╝

この例では、その人はオフィスに07:09時間留まりました

よろしくアンドレ

4

1 に答える 1

0

OK、合計するのはかなり簡単です。一致するタイムスタンプなしでタイムスタンプを削除することはより困難です。

合計について:日付と時刻は数値として内部に保存されます。真夜中まで誰も働いていないと仮定すると、あなたがしなければならないのは、すべての「イン」時間を合計し、それをすべての「アウト」時間から引くことです。このように:

SELECT [TotOut]-[TotIn] AS TotHours, *
FROM (SELECT CheckIn.Employee, CheckIn.[Local Date], Sum(CheckIn.[Local Time]) AS [TotIn]
FROM CheckIn
WHERE (((CheckIn.Staus)="In"))
GROUP BY CheckIn.Employee, CheckIn.[Local Date])  AS TotIn INNER JOIN (SELECT CheckIn.Employee, CheckIn.[Local Date], Sum(CheckIn.[Local Time]) AS [TotOut]
FROM CheckIn
WHERE (((CheckIn.Staus)="Out"))
GROUP BY CheckIn.Employee, CheckIn.[Local Date])  AS TotOut ON (TotIn.Employee = TotOut.Employee) AND (TotIn.[Local Date] = TotOut.[Local Date]);

不一致の時間をなくすことは可能ですが、困難です。このクエリはそのほとんどを実行します。ただし、最初のレコードをスキップするため、調整する必要があります。

SELECT A.ID, A.[Local Time], B.[Local Time] AS [Prev Time], A.Staus
FROM CheckIn AS A LEFT JOIN CheckIn AS B ON (A.Employee = B.Employee) AND (A.[Local Date] = B.[Local Date])
WHERE (((B.[Local Time])=DMax("[local time]","[checkin]","[local time] < #" & [a].[Local Time] & "#")) AND ((A.Staus)<>[b].[staus]))
ORDER BY A.[Local Time];

また、最初に、ステータスが「Out」で始まるレコードをスキップするレコードセットを作成する必要があります。これが役立つかもしれない記事です

于 2012-12-14T05:43:55.810 に答える