基于CodeIgniter从MySQL获取员工每日最后签退记录
解决CRM员工每日最晚签退记录获取错误的方案
原代码问题分析
- 限制获取50条记录:如果员工某一天的最晚签退记录不在前50条结果里,会错误地将更早的记录当作当日最晚签退。
- 仅存储签退时间字符串:丢失了该记录的其他关键信息(如签到时间),虽
Y-m-d H:i:s格式字符串可比较时间先后,但直接用原始时间戳更精准,避免格式转换的潜在问题。
方案一:数据库层面直接查询(推荐)
通过SQL分组查询直接获取每日最晚签退记录,效率更高,减少PHP端数据处理量。
用CodeIgniter实现的代码:
// 生成子查询:按日期分组获取每日最晚签退时间 $subquery = $this->db->select('employee_id, DATE(FROM_UNIXTIME(check_out_time)) AS check_date, MAX(check_out_time) AS max_check_out') ->where('employee_id', $user_id) ->group_by('employee_id, check_date') ->get_compiled_select('events'); // 关联原表获取完整的最晚签退记录 $query = $this->db->select('e.*') ->from('events e') ->join("($subquery) latest", 'e.employee_id = latest.employee_id AND e.check_out_time = latest.max_check_out', 'inner') ->where('e.employee_id', $user_id) ->order_by('latest.check_date DESC') ->get(); $latestDailyCheckouts = $query->result(); // 可选:格式化时间戳为可读格式 foreach($latestDailyCheckouts as $record){ $record->formatted_check_in = (new DateTime("@".$record->check_in_time))->format('Y-m-d H:i:s'); $record->formatted_check_out = (new DateTime("@".$record->check_out_time))->format('Y-m-d H:i:s'); }
逻辑说明
- 子查询按员工ID和签退日期分组,找出每个日期的最晚签退时间戳。
- 通过内连接关联原表,获取对应最晚签退时间的完整记录。
- 按日期倒序排列,方便查看最新记录。
方案二:修正PHP端处理逻辑
若必须在PHP端处理,需先获取该员工所有相关记录,再通过时间戳比较筛选每日最晚记录:
// 移除50条限制,获取该员工所有签到签退记录 $this->db->order_by('check_out_time desc'); $this->db->where('employee_id', $user_id); $query = $this->db->get('events'); $events = $query->result(); $visits = []; foreach($events as $event){ $checkOutTimestamp = $event->check_out_time; $checkOutTime = new DateTime("@".$checkOutTimestamp); $day = $checkOutTime->format('Y-m-d'); // 用原始时间戳比较,避免字符串比较的潜在问题 if (!isset($visits[$day]) || $visits[$day]->check_out_time < $checkOutTimestamp) { // 保留完整记录,并格式化时间字段 $event->formatted_check_in = (new DateTime("@".$event->check_in_time))->format('Y-m-d H:i:s'); $event->formatted_check_out = $checkOutTime->format('Y-m-d H:i:s'); $visits[$day] = $event; } }
修正点
- 移除
get('events',50)中的50条限制,确保获取所有相关记录。 - 使用原始时间戳进行比较,比字符串比较更精准可靠。
- 保留完整记录对象,而非仅存储签退时间字符串,方便后续使用其他字段。
内容的提问来源于stack exchange,提问作者Yazan
相关产品推荐
相关产品推荐

