You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:36:03