0

我有一个有多个列,但只有三个对案例很重要,table.a让我们将它们命名为. 我得到了这个查询: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和排序。为什么不是每天?因为有些员工晚上开始工作,第二天早上完成。 分类应按计数进行,例如如果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... 所需输出示例:statustime_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;  

它检索三个额外的列(userid_test、timestamp_test 和差异),但对我来说很好,因为我根据之前的时间戳和时间间隔获得了每个时间戳的类型和状态。

于 2015-06-10T20:50:01.060 回答