0

複数の列を持つものがありますが、table.aケースで重要なのは 3 つだけです。 私はこのクエリを得ました:time_stampemployee_numberstation_id

SELECT checktime AS time_stamp, userid AS employee_number, SN AS station_id
FROM checkinout;

この情報を取得するには:

+---------------------+-----------------+---------------+
|      time_stamp     | employee_number |  station_id   | 
+---------------------+-----------------+---------------+
| 30/05/2015  8:01:07 |               5 | 6068144700170 |
| 31/05/2015  8:05:17 |               2 | 6068144700170 |
| 31/05/2015 17:03:47 |               2 | 6068144700170 |
| 31/05/2015 22:03:24 |              13 | 6068144700170 |
| 01/06/2015 02:30:34 |              13 | 6068144700170 |
| 01/06/2015 03:24:33 |              13 | 6068144700170 |
| 01/06/2015 07:14:24 |              13 | 6068144700170 |
| ...                 |             ... | ...           |
+---------------------+-----------------+---------------+

そして、私が必要としているのは、20 時間間隔ごとにそれぞれをtype順番にstatus分類することです。なぜ毎日ではないのですか?一部の従業員は夜に労働を開始し、他の日の朝に終了するため. employee.a のタイムスタンプが 1 つの場合は t=0/s=I、employee.a のタイムスタンプが 2 つの場合は t=0/s=I - t=0/s= のように、カウントで 分類する必要があります。 O、employee.a のタイムスタンプが 3 つの場合、t=0/s=I - t=2/s=O - t=0/s=O、employee.a のタイムスタンプが 4 つの場合、t=0/s= I - t=2/s=O - t=2/s=I - t=0/s=O... 必要な出力の例:time_stampemployee_number
time_stamp

+---------------------+-----------------+---------------+---------+-----------+
|      time_stamp     | employee_number |  station_id   | type_id | status_id |
+---------------------+-----------------+---------------+---------+-----------+
| 30/05/2015  8:01:07 |               5 | 6068144700170 |       0 |         I |
| 31/05/2015  8:05:17 |               2 | 6068144700170 |       0 |         I |
| 31/05/2015 17:03:47 |               2 | 6068144700170 |       0 |         O |
| 31/05/2015 22:03:24 |              13 | 6068144700170 |       0 |         I |
| 01/06/2015 02:30:34 |              13 | 6068144700170 |       2 |         O |
| 01/06/2015 03:24:33 |              13 | 6068144700170 |       2 |         I |
| 01/06/2015 07:14:24 |              13 | 6068144700170 |       0 |         O |
| ...                 |             ... | ...           |     ... |       ... |
+---------------------+-----------------+---------------+---------+-----------+

この質問は私を助けますが、問題を完全には解決しませんでした:
MySQL: Get start & end timestamp for each day
Mysql Show records where timestamp interval is lower than 4 minutes

4

1 に答える 1

1

解決しました!これに基づいて: MySQL - 前の行から値を減算し、
コードでグループ化:

SELECT
t1.userid employee_number,
t1.checktime time_stamp,
@diference := IF( @lastUserid = t1.userid, TIMEDIFF(t1.checktime,@lastChecktime), 0 ) diference,
@lastUserid := t1.userid userid_test,
@lastChecktime := t1.checktime timestamp_test,
@status_id := CASE
WHEN @diference = '0' THEN 'I'
WHEN @diference BETWEEN '00:00:00' AND '12:00:00' THEN 'O'
WHEN @diference BETWEEN '12:00:01' AND '20:59:59' THEN 'I'
WHEN @diference > '26:00:01' THEN 'I'
WHEN @diference BETWEEN '21:00:00' AND '26:00:00' THEN 'O'
END as status_id,
@type_id := CASE
WHEN @diference = '0' THEN 0
WHEN @diference > '99:59:59' THEN 0
WHEN @diference BETWEEN '12:30:00' AND '99:59:59' THEN 0
WHEN @diference BETWEEN '06:30:00' AND '12:29:59' THEN 1
WHEN @diference BETWEEN '00:25:00' AND '06:29:59' THEN 2
WHEN @diference BETWEEN '00:00:15' AND '00:24:59' THEN 4
END as type_id,
t1.SN station_id
FROM
icdat.checkinout t1,
( SELECT @lastUserid := 0,
@lastChecktime := 0 ) SQLVars
ORDER BY t1.userid, t1.checktime;  

3 つの追加の列 (userid_test、timestamp_test、diference) を取得しますが、以前のタイムスタンプと時間間隔に基づいて各タイムスタンプのタイプとステータスを取得したので、私にとっては問題ありません。

于 2015-06-10T20:50:01.060 に答える