技术问询:如何获取早于8:30、8:30-9:00及晚于9:00的员工打卡数据
统计指定部门员工分时段打卡情况
针对你需要获取指定部门(DP_CODE='C019')2018年3月员工早于8:30、8:30-9:00以及晚于9:00的打卡数据需求,我整理并优化了对应的SQL查询代码——原代码在时间判断和聚合写法上存在一些语法问题,下面是修正后的版本:
SELECT emp.emc_name, SUM(CASE WHEN CAST(s.SAD_DATE AS TIMESTAMP) < TO_TIMESTAMP('08:30', 'HH24:MI') THEN 1 ELSE 0 END) AS "Before 8:30am", SUM(CASE WHEN CAST(s.SAD_DATE AS TIMESTAMP) BETWEEN TO_TIMESTAMP('08:30', 'HH24:MI') AND TO_TIMESTAMP('09:00', 'HH24:MI') THEN 1 ELSE 0 END) AS "8:30am To 9am", SUM(CASE WHEN CAST(s.SAD_DATE AS TIMESTAMP) > TO_TIMESTAMP('09:00', 'HH24:MI') THEN 1 ELSE 0 END) AS "After 9am" FROM Shift s JOIN emply emp ON s.EM_CODE = emp.EM_CODE WHERE emp.DP_CODE = 'C019' AND s.SAC_INOUT = 1 AND s.SAD_DATE BETWEEN '01-mar-2018' AND '31-mar-2018' GROUP BY emp.emc_name ORDER BY emp.emc_name;
代码说明:
- 用
CASE WHEN搭配SUM实现条件聚合,精准统计每个员工在不同时段的打卡次数 - 修正了时间判断逻辑:直接通过时间戳完整比较来区分8:30和9:00的分界点,避免原代码仅提取小时数导致的判断误差
- 使用标准的
JOIN语法替代旧的逗号连接表写法,让SQL结构更清晰易读 - 调整了
GROUP BY与ORDER BY的顺序,符合SQL语法规范
内容的提问来源于stack exchange,提问作者user2119324
相关产品推荐
相关产品推荐

