1

次の順序でクロック エントリを格納するテーブルがあります。

UID         Clock                    Status
===         =====                    ======

R01         2013-01-01 17:00:00      Clockin
R01         2013-01-01 17:10:00      Clockin
R01         2013-01-01 23:45:00      Clockin

私の現在の解決策は、最小/最大日付をケースと左結合で使用して、次の順序でエントリを配置することです

UID        Date         ClockIn    ClockOut
===        ====         =======    ========
R01        2013-01-01    17:00:00  23:45:00

クロック エントリが午前 0 時を過ぎた場合、どのように対処すればよいですか。つまり、

UID         Clock                    Status
===         =====                    ======
R01         2013-01-01 17:00:00      Clockin
R01         2013-01-02 00:45:00      Clockin

上記のように、以下のような 2 つのエントリが生成され、従業員の勤務時間は 7.45 時間ゼロになります。

UID        Date          ClockIn               ClockOut
===        ====          =======               ========
R01        2013-01-01    2013-01-01 17:00:00   2013-01-01 17:00:00
R01        2013-01-02    2013-01-02 00:45:00   2013-01-02 00:45:00

前もって感謝します。

これは、SQL 2008R2 で使用されるストアド プロシージャのコードです。

SELECT A.Device,A.DID, A.Name, A.ClockDate,Clockin ,ClockOut
FROM 
(
    SELECT Device,DID,Name, CONVERT(DATE, DeviceClock) 'ClockDate', 
    min(case when clock=Clock and Status ='Clock In' OR status='Clock Out' OR status='Access In' then clock  end) 'CLock In'

    FROM TABLE  
    group by Device,DID,Name, CONVERT(DATE, DeviceClock)
) as A
LEFT JOIN 
(
    SELECT Device,DID,Name, CONVERT(DATE, DeviceClock) 'ClockDate', 

max(case when clock=Clock and Status ='Clock in' or status='Clock Out' OR status='Access In' then Clock end) 'Clock Out'


    FROM TABLE 
    group by Device,DID,Name, CONVERT(DATE, DeviceClock)
) as B
ON A.DID = B.DID AND A.ClockDate = B.ClockDate
4

2 に答える 2

2

ここで考慮していないことがたくさんあります。勤怠システムは非常に複雑です。例えば:

  • クロックインが真夜中のほんの数分前で、クロックアウトが朝のかなり遅い場合はどうなりますか? 何日までの時間を記録しますか?
  • 時間が均等に分割されている場合、たとえば午後 10 時から午前 2 時までとします。これは 1 日目の 1 つの 4 時間シフトですか? または2日目?それとも、2時間のシフトが2回ですか?
  • UTC で時刻を記録していますか? ローカル変換を行っていますか? サマータイムの取り扱いは?(現地時間でのアウトマイナスインは経過時間の正確な測定値ではありません!)
  • 丸め?いくらで?どのシナリオで?
  • 抜けたパンチをどう処理する?重複パンチ?

これらのシナリオを処理するために進化したシステム全体があります。彼らは通常、残業計算、ジョブ コスト、スケジューリングなどの作業ルールも処理しますが、それらはすべて、あなたが説明した基本的な問題のケースから始まります。

次のパンチ、または特定のタイプの次のパンチ、または同じ日付の次のパンチと常にペアになるとは限りません。対処すべきシナリオの組み合わせは多数あり、これを単純な SQL ステートメントやストアド プロシージャで表現することはできません。試してみることはできますが、対処しなければならないエッジケースがたくさんあります。

これらのケースをすでに処理している製品の購入を検討します。独自のコードを作成する場合は、SQL で作成しないでください。SQL から生データを取得し、それをビジネス ロジックで使用して処理エンジンを生成します。

于 2012-12-31T18:04:35.947 に答える
1

マットが言ったことは良い一般的な答えであり、彼が言及したすべての注意事項を読んでください.これ:

SELECT Device,DID,Name, convert( DATE, dateadd(hour, -3, CONVERT(DATE, DeviceClock))) 'ClockDate', 

max(case when clock=Clock and Status ='Clock in' or status='Clock Out' OR status='Access In' then Clock end) 'Clock Out'

FROM TABLE 
group by Device,DID,Name, convert( DATE, dateadd(hour, -3, CONVERT(DATE, DeviceClock)))

結合された 2 つの選択のそれぞれで。1 日の始まりと終わりの時間を効果的に 3 時間ずらすことができます。もちろん、誰かが午前 3 時を超えて働いたり、午前 3 時より前に開始したりする場合、これは機能しません。

于 2012-12-31T18:23:56.107 に答える