1

時間追跡システムでデータを分析するクエリを作成しようとしています。ユーザーがパンチインまたはパンチアウトするたびに、パンチ時間を記録する行が作成されます。したがって、9:00 にパンチインし、5:00 にパンチアウトすると、それに応じて記録された日付スタンプを持つ 2 つの行があります。workingpunch_ts基本的に(タイムスタンプ列)のdatediffを時間単位で合計して行を反復処理するクエリが必要です。

各行には、パンチがパンチ インかパンチ アウトかを示す識別子 ( inout_id、インの場合は 1、アウトの場合は 2) があります。

たとえば、

ID  | workingpunch_ts         | inout_id
----------------------------------------------
123 | 2011-02-16 09:00:00.000 | 1
124 | 2011-02-16 17:00:00.000 | 2

それは8時間になります。次に、テーブル内の行のペアごとにこのプロセスを繰り返す必要があります。

これを達成する方法について考えていますか?

4

2 に答える 2

1

このクエリは、人々が同じ日に複数回パンチインおよびパンチアウトした場合に問題を引き起こします。

テーブル スキーマ:

CREATE TABLE [dbo].[TimePunch](
    [TimeCardID] [int] IDENTITY(1,1) NOT NULL,
    [PunchTime] [datetime] NOT NULL,
    [InOrOut] [int] NOT NULL,
    [UserID] [int] NOT NULL,
    [DayofPunch] [datetime] NOT NULL,
 CONSTRAINT [PK_TimePunch] PRIMARY KEY CLUSTERED 
(
    [TimeCardID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 10) ON [PRIMARY]
) ON [PRIMARY]

クエリ:

select 
    tIn.UserID,
    tIn.DayOfPunch,
    DateDiff(Hour, tIn.PunchTime, tOut.PunchTime) as HoursWorked
FROM
    TimePunch tIn,
    TimePunch tOut
WHERE
    tIn.InOrOut = 1
AND tOut.InOrOut = 2
AND tIn.UserID = tOut.UserID
AND tIn.DayofPunch = tOut.DayOfPunch
于 2011-02-23T21:25:27.560 に答える
0

数時間で、確かに

select empid, cast(datediff(d,0,workingpunch_ts) as datetime),
    SUM(case when inout_id = 2 then 1 else -1 end *
    datediff(MI, datediff(d,0,workingpunch_ts), workingpunch_ts))/60.0 as Hours
from clock
where workingpunch_ts between '20110201' and '20110228 23:59:59.999'
group by empid, datediff(d,0,workingpunch_ts)

インとアウトがペアになっている限り、すべてのアウトを追加し、すべてのインを削除します。

 - IN  (9)
 + OUT (12)
 - IN  (13:15)
 + OUT (17)

主なコードは2行目と3行目です
。 datediff-datediff は、それぞれworkingpunch_tsの真夜中からの分数を計算し、パンチアウトの場合は CASEinout_idステートメントを使用して負にします。

その他は、日付範囲内で従業員と日ごとにグループ化する必要がある実際のシナリオのために追加されます。

于 2011-02-23T21:31:20.953 に答える