0

LogicalReaderType という名前の列を持つ sql テーブルがあり、その日に誰かがバッジを付けているかどうかを判断します。その時点でのタイムスタンプである BadgeTime という別の列があります。一日の労働時間を計算したい。

2 つの注意事項:

  1. 時々、人々は間違いを犯してバッジアウト (その日の時間を完了) した後、バッジインせずにゲートに戻ってきます。そして再びバッジアウトします。スクリプトが最良の推測を行うか、最初のバッジを選択して 2 番目のバッジを無視できるようにしたいと考えています。
  2. 人々は 3 交代制で働くため、午前 12 時を超えて計算できるほどスマートである必要があります。

これは、私が一緒に働く 1 人の従業員の 1 週間分の SQL 出力の例です。

BadgeNumber     LastName    Initials    LogicalReaderType   BadgeTime   EmployeeNumber
153568488433    Doe J   3   41253.32631 54822
153568488433    Doe J   4   41253.68821 54822
153568488433    Doe J   3   41254.3187  54822
153568488433    Doe J   3   41254.31877 54822
153568488433    Doe J   4   41254.72185 54822
153568488433    Doe J   3   41255.32757 54822
153568488433    Doe J   4   41255.58274 54822
153568488433    Doe J   3   41255.6378  54822
153568488433    Doe J   4   41255.71527 54822
153568488433    Doe J   3   41256.31372 54822
153568488433    Doe J   4   41256.55927 54822
153568488433    Doe J   3   41256.56036 54822
153568488433    Doe J   4   41256.69249 54822
153568488433    Doe J   3   41257.3234  54822
153568488433    Doe J   4   41257.37054 54822
153568488433    Doe J   4   41257.69721 54822

出力例として、次のようなテーブルが必要です。

In              Out             WorkTime
41253.326308    41253.688206    0.361898
41254.318704                   -41253.318704
41254.318773    41254.721852    0.403079
41255.327569    41255.582743    0.255174
41255.637801    41255.715266    0.077465
41256.313715    41256.559271    0.245556
41256.560359    41256.692488    0.132129
41257.323403    41257.370544    0.047141
                41257.697211    41257.697211

詳細を提供できる場合はお知らせください。

編集:利用可能な他のフィールドのいくつかを追加しました。

4

1 に答える 1

2

各アウトに関連付けられている次のバッジ タイムを見つける必要があります。これを行う最も一般的な方法は、相関サブクエリを使用することです。

その時間ができたら、ロジックを実行して作業時間を取得できます。次のクエリはこのアプローチを採用しており、稼働時間が 1 日未満の場合に外出時間が有効であると想定しています。

select BadgeTime as In,
       (case when NextBadgeTime - BadgetTime < 1 then NextBadgeTime end) as Out,
       (case when NextBadgeTime - BadgetTime < 1 then NextBadgeTime - BadgeTime end) as WorkTime
from (select t.*,
             (select MIN(BadgeTime)
              from t t2
              where t2.BadgeNumber = t.BadgeNumber and
                    t2.LogicalReaderType = 4 and
                    t2.BadgeTime > t.BadgeTime
             ) NextOutTime
      from t
      where LogicalReaderType = 3
     ) t
于 2012-12-18T18:17:10.463 に答える