SQL 考勤打卡问题

news/2024/11/20 4:55:50/

1: 业务场景

        员工考勤打卡,分早,晚打卡,早上8:00到9:00 为早上打卡时间,这个时间范围内第一次打卡视为有效打卡,本时间段内其它打卡视为重复打卡;

       相同情况,晚上下班打卡时间范围为17:00到18:00,这个时间范围内的第一次打开视为有效打卡,本时间内的其它打卡视为重复打卡;

       其余时间范围内的打卡视为无效打卡

2:数据准备

Create table T_ClockIn (
UserId int,
CheckIn date
);Insert into T_ClockIn VALUES (1,'2018/12/1 8:25');
Insert into T_ClockIn VALUES (1,'2018/12/1 8:26');
Insert into T_ClockIn VALUES (1,'2018/12/1 17:02');
Insert into T_ClockIn VALUES (1,'2018/12/2 8:27');
Insert into T_ClockIn VALUES (1,'2018/12/2 8:37');
Insert into T_ClockIn VALUES (1,'2018/12/2 17:27');
Insert into T_ClockIn VALUES (1,'2018/12/2 18:27');
Insert into T_ClockIn VALUES (2,'2018/12/1 8:26');
Insert into T_ClockIn VALUES (2,'2018/12/1 17:03');
Insert into T_ClockIn VALUES (2,'2018/12/1 17:29');
Insert into T_ClockIn VALUES (2,'2018/12/1 18:01');
Insert into T_ClockIn VALUES (2,'2018/12/2 8:01');
Insert into T_ClockIn VALUES (2,'2018/12/2 9:27');
Insert into T_ClockIn VALUES (2,'2018/12/2 17:59');
Insert into T_ClockIn VALUES (2,'2018/12/2 18:27');

数据如下

3:过程分析

第一步:先将数据利用case when 根据打卡时间分为

1:早打卡     2:晚打卡   0:其余时间打卡     三类

SELECT USERID,checkin,
CASE 
WHEN to_char(checkin,'HH24:MI:SS') BETWEEN '08:00:00' AND '09:00:00' THEN '1' 
WHEN to_char(checkin,'HH24:MI:SS') BETWEEN '16:00:00' AND '18:00:00' THEN '2' 
ELSE '0'
END as 状态
from T_ClockIn

结果

第二步:利用窗口函数over根据用户UserID,打开时间的日期部分作为分组依据,区分有效打卡和重复打卡

select t.*,row_number() 
over (partition by t.userid,t.状态,to_char(checkin,'yyyy-mm-dd') order by t.checkin) as 状态2 
from (
SELECT USERID,checkin,
CASE 
WHEN to_char(checkin,'HH24:MI:SS') BETWEEN '08:00:00' AND '09:00:00' THEN '1' 
WHEN to_char(checkin,'HH24:MI:SS') BETWEEN '16:00:00' AND '18:00:00' THEN '2' 
ELSE '0'
END as 状态
from T_ClockIn) t

结果

难点:可以配合以下SQL结果理解:剔除状态为0非要求时间范围之外打卡记录,剩下的都是时间范围内打卡,

1:有效打卡  2 重复打卡

select t.*,row_number() 
over (partition by t.userid,t.状态,to_char(checkin,'yyyy-mm-dd') order by t.checkin) as 状态2 
from (
SELECT USERID,checkin,
CASE 
WHEN to_char(checkin,'HH24:MI:SS') BETWEEN '08:00:00' AND '09:00:00' THEN '1' 
WHEN to_char(checkin,'HH24:MI:SS') BETWEEN '16:00:00' AND '18:00:00' THEN '2' 
ELSE '0'
END as 状态
from T_ClockIn) t WHERE t.状态>0

结果

第三步

利用状态(区分时间范围内的打卡)  状态2(时间范围内的有效打卡和重复打卡)组合分析判断达到打卡结果统计

   状态=0 then '无效'              状态0直接为无效打卡                         ----->无效
   状态>0 AND a.状态2=1      时间范围内的打卡  并且 有效打卡      ----->有效打卡
   状态>0 AND a.状态2=2      时间范围内的打卡  并且 重复打卡      ----->重复打卡
 最终SQL如下

SELECTa.userid,a.checkin,CASEWHEN a.状态 = 0 THEN'无效'WHEN a.状态 > 0AND a.状态2 = 1 THEN'有效'WHEN a.状态 > 0AND a.状态2 = 2 THEN'重复'END AS 状态
FROM(SELECTt.*,ROW_NUMBER() OVER(PARTITION BY t.userid, t.状态, to_char(checkin, 'yyyy-mm-dd')ORDER BYt.checkin) AS 状态2FROM(SELECTuserid,checkin,CASEWHEN to_char(checkin, 'HH24:MI:SS') BETWEEN '08:00:00' AND '09:00:00' THEN'1'WHEN to_char(checkin, 'HH24:MI:SS') BETWEEN '16:00:00' AND '18:00:00' THEN'2'ELSE'0'END AS 状态FROMt_clockin) t) a
ORDER BYa.userid,a.checkin

 结果

 知识点:窗口函数的使用     case when 


http://www.ppmy.cn/news/728015.html

相关文章

考勤打卡不如自我约束

打卡的意义何在 公司打卡一种理解是起到监督约束的作用,一种是作为绩效考核的凭证,也是在保护员工的权益。但是一般公司考勤在薪资中的占比并不是很大,企业更多的是想要通过这种方式来端正员工对待工作的态度,打卡为了提醒员工要…

考勤打卡——自律·做好时间管理

为什么要考勤打卡? 考勤打卡在一家公司中必不可少,那他意义何在呢?一是作为绩效考勤的凭证,二是提醒员工快速进入工作状态。 打卡是一种他律 打卡是一种形式,是我们需要被约束的一种形成良好习惯的过程,…

【AJAX】原生AJAX设置请求超时、网络异常处理、取消请求处理

// 超时设置 2s xhr.timeout 2000; // 超时回调 xhr.ontimeout function(){ alert(网络异常,请稍后重试。) }; // 网络异常 xhr.onerror function(){ alert(网络出问题。) }; 以上代码放在new和open之间 //取消请求处理 xhr.abort(); 如何解决重复发送请求&#x…

打印流~~

作用:打印流可以实现方便,高效的打印数据到文件中去。打印流一般指:PrintStream(字节),PrintWriter(字符)两个类可以实现打印什么数据就是什么数据 2:两者区别 打印功能…

魅族 系统更新服务器,Flyme

系统 修复 偶现的电话报错问题 修复 偶现的智能短信报错问题 阅读 新增 分类聚合订阅 新增 文章评论可以点赞,同时有热门评论 新增 可以长按垃圾评论选择举报 个性化中心 新增 支持主题特价功能 新增 在线铃声频道 新增 来电、短信等铃声配置功能 新增 资源下载管理…

刷了Flyme 之后,这些神技能你也能get

昨日,魅族Flyme已正式公布首批第三方适配机型,让Flyme粉儿大呼过瘾。目前第一批适配的第三方机型有一加3T / ZUK Z2 / Nexus 6P 等10款,后续还将有其他机型适配固件发布。 在众多手机系统中,Flyme的UI设计极具特色,从最…

android 魅族短信拦截,Flyme 9都是最纯净安全的安卓系统。

或许不少人注意到,时下购机一言不合就是抢购风潮,当然这也要这款产品十分出色,各方面都满足用户需求才行,比如魅族新出的魅族18系列5G双旗舰这样的手机。 魅族18系列开售28分钟全网售罄,也算是被抢购了,而让…

全面又强大 魅族Flyme安全能力大盘点

当智能手机承载的东西越来越多,与我们的生活和工作密不可分时,手机安全的重要性也更加凸显。提供给用户更加全面和强大的安全功能,保障用户在各种场景下的手机使用安全,让用户用得安心,是整体用户体验得以实现的大前提…