Laravel使用MySQL生成考勤报表 按时间段拆分打卡时间动态查询
考勤时段动态查询解决方案
核心逻辑是提取datetime字段的时间部分做判断,替换原有硬编码的固定日期,即可实现任意日期的时段自动匹配。不同数据库的时间提取语法略有差异,以下是常见数据库的实现方案:
MySQL 版本
SELECT DATE(datetime) AS attend_date, id, MIN(CASE WHEN TIME(datetime) BETWEEN '06:30:00' AND '08:30:00' THEN datetime ELSE NULL END) AS TimeInAM, MAX(CASE WHEN TIME(datetime) BETWEEN '11:30:00' AND '12:30:00' THEN datetime ELSE NULL END) AS TimeOutAM, MIN(CASE WHEN TIME(datetime) BETWEEN '12:30:00' AND '13:30:00' THEN datetime ELSE NULL END) AS TimeInPM, MAX(CASE WHEN TIME(datetime) BETWEEN '16:30:00' AND '21:30:00' THEN datetime ELSE NULL END) AS TimeOutPM FROM time_attendances WHERE id = 1345 -- 可按需加日期范围过滤,例如查当月数据 -- AND datetime >= DATE_FORMAT(NOW(), '%Y-%m-01') -- AND datetime < DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH) GROUP BY attend_date, id;
说明:此处用MIN/MAX聚合是为了处理同一时段多次打卡的情况,上午上班取最早打卡记录,下班取最晚打卡记录,不需要聚合可直接去掉GROUP BY和聚合函数
其他数据库适配
- SQL Server:用
CAST(datetime AS TIME)替换TIME(datetime),用CAST(datetime AS DATE)替换DATE(datetime) - PostgreSQL:用
datetime::time替换TIME(datetime),用datetime::date替换DATE(datetime) - Oracle:用
TO_CHAR(datetime, 'HH24:MI:SS')做时间区间比对,用TRUNC(datetime)提取日期
内容的提问来源于stack exchange,提问作者Romneel Bacon
相关产品推荐
相关产品推荐

