0

我正在使用zkteco-sdk-php从 ZK 考勤设备中检索数据。

结果是这样的

用户标识符 ID 姓名 状态 日期 时间 类型
55 275 雇用1 指纹 19-06-2021 08:14:16 报到
55 275 雇用1 指纹 19-06-2021 11:15:20 查看

*所有数据不是按用户排序的,而是按第一次指纹考勤排序的,所以日志与不同的用户和不同的考勤类型混在一起

我想将检索到的数据插入数据库问题是每个日志(签入或签出)作为单行检索数据我想在同一天插入(签入&&签出同一用户)排 )

这就是我的目标

ID 用户身份 报到 查看
55 275 19-06-2021 08:14:16 19-06-2021 11:15:20

这是从 zk 检索数据的代码

                    $attendance = $zk->getAttendance();
                    if (count($attendance) > 0) {
                        $attendance = array_reverse($attendance, true);
                        sleep(1);
                        foreach ($attendance as $attItem) {
                            ?>
                            <tr>
                                <td><?php echo($attItem['uid']); ?></td>
                                <td><?php echo($attItem['id']); ?></td>
                                <td><?php echo(isset($users[$attItem['id']]) ? $users[$attItem['id']]['name'] : $attItem['id']); ?></td>
                                <td><?php echo(ZK\Util::getAttState($attItem['state'])); ?></td>
                                <td><?php echo(date("d-m-Y", strtotime($attItem['timestamp']))); ?></td>
                                <td><?php echo(date("H:i:s", strtotime($attItem['timestamp']))); ?></td>
                                <td><?php echo(ZK\Util::getAttType($attItem['type'])); ?></td>
                            </tr>



4

3 回答 3

0

MySQL:

SELECT
   t1.ID,
   t1.UserID,
   ADDTIME(CONVERT(t1.`date`, DATETIME), t1.`time`) as "Check-in",
   ADDTIME(CONVERT(t2.`date`, DATETIME), t2.`time`) as "Check-out"
FROM table t1
LEFT JOIN table t2 ON t2.ID=t1.ID 
                  and t2.UserID=t1.UserID
                  and t2.Type = 'Check-out'
WHERE 
   ID = 55
   and UserID = 275
   and Type = 'Check-in'

注意:您需要替换table为正确的表名。

关于如何在 PHP 中使用此 SQL 查询的不同示例可以在很多地方找到,例如:Google: how to query MySQL from PHP

于 2021-06-20T09:51:47.727 回答
0

我认为可以这样实现:

SELECT UID,
       ID,
       CONCAT(date,' ',MIN(time)) AS Check_in,
       CONCAT(date,' ',MAX(time)) AS Check_out
FROM attendance
GROUP BY date, UID, ID;

但我必须指出date,您的示例中的数据不是标准的 MySQLDATE数据类型,如果您要插入的目标表具有如下结构:

destination_table 
(UID INT, 
ID INT,
Check_in DATETIME,  <--- this datatype
Check_out DATETIME); <---

插入不会成功,会返回错误:

日期时间值不正确:第 1 行的“Check_in”列的“19-06-2021 08:14:16”

否则,如果destination_table数据类型为VARCHAR(),则插入不会有问题。但是,我强烈建议至少在目标表上使用标准格式。因此,如果源表确实将日期存储为VARCHAR()并且目标表正在使用DATETIME数据类型,则您需要STR_TO_DATE()

INSERT INTO destination_table
SELECT UID,
       ID,
       CONCAT(STR_TO_DATE(date,'%d-%m-%Y'),' ',MIN(time)) AS Check_in,
       CONCAT(STR_TO_DATE(date,'%d-%m-%Y'),' ',MAX(time)) AS Check_out
FROM attendance
GROUP BY date, UID, ID;

这是一个演示小提琴

于 2021-06-23T01:17:16.883 回答
0

您应该“按原样”存储日志 - 单独的行以签入和签出,并在选择时通过UUIDand连接两行ID

select 
    log_in.uuid,
    log_in.id,
    log_in.name,
    log_in.state,
    log_in.event_time as log_in_time,
    log_out.event_time as log_out_time
from zk_log log_in
join zk_log log_out on log_in.uuid = log_out.uuid and log_in.id = log_out.id
where log_in.event_type = 'check-in' and log_out.event_type = 'check-out';
于 2021-06-20T13:13:37.440 回答