题目

随便找一段考勤数据,考勤资料都是有进有出的
早上08:55上班,晚上18:00下班,除去中午12:00到下午13:30为中休外,其他时间段只有累计10分钟可以出去,否则会产能考勤警告。

思路分析

进出时间的相减可以得到两个时间段的时间差,一天内所有进出时间差值的总和约定时间相差10分钟以内。但是,由于要算考勤警告,我们这里只要算正常工作时间内的时间即可。

解题

使用数据库:mysql

第一步创建数据原表:

DROP TABLE IF EXISTS attendance_warning_tb;
CREATE TABLE IF NOT EXISTS attendance_warning_tb (id          VARCHAR(20) COMMENT '员工id',date_time   DATETIME    COMMENT '打卡记录',out_in_flag VARCHAR(20) COMMENT '进出'
);

使用excel自带函数将数据整合成插入语句sql

CONCATENATE(“insert into attendance_warning_tb values (’”&A1&"’ , ‘"&B1&"’ , ‘"&C1&"’)")

结果:

INSERT INTO attendance_warning_tb VALUES ('001' , '2022-01-26 08:42:00' , 'in')
,('001' , '2022-01-26 11:52:52' , 'out')
,('001' , '2022-01-26 12:12:23' , 'in')
,('001' , '2022-01-26 18:22:54' , 'out')
,('001' , '2022-01-25 08:50:33' , 'in')
,('001' , '2022-01-25 11:52:03' , 'out')
,('001' , '2022-01-25 12:23:22' , 'in')
,('001' , '2022-01-25 18:15:36' , 'out')
,('001' , '2022-01-24 08:50:33' , 'in')
,('001' , '2022-01-24 11:52:03' , 'out')
,('001' , '2022-01-24 12:23:22' , 'in')
,('001' , '2022-01-24 18:15:36' , 'out')
,('001' , '2022-01-22 11:25:33' , 'in')
,('001' , '2022-01-22 18:37:35' , 'out')
,('001' , '2022-01-21 08:45:36' , 'in')
,('001' , '2022-01-21 11:54:42' , 'out')
,('001' , '2022-01-21 12:20:38' , 'in')
,('001' , '2022-01-21 14:25:03' , 'out')
,('001' , '2022-01-21 15:02:04' , 'in')
,('001' , '2022-01-21 18:23:39' , 'out')
,('002' , '2022-01-26 18:14:11' , 'out')
,('002' , '2022-01-26 11:17:50' , 'in')
,('002' , '2022-01-26 11:13:25' , 'out')
,('002' , '2022-01-26 08:53:01' , 'in')
,('002' , '2022-01-25 18:13:40' , 'out')
,('002' , '2022-01-25 12:10:06' , 'in')
,('002' , '2022-01-25 11:51:09' , 'out')
,('002' , '2022-01-25 09:04:29' , 'in')
,('002' , '2022-01-24 18:13:34' , 'out')
,('002' , '2022-01-24 12:15:36' , 'in')
,('002' , '2022-01-24 12:10:28' , 'out')
,('002' , '2022-01-24 08:51:23' , 'in')
,('002' , '2022-01-22 13:51:29' , 'out')
,('002' , '2022-01-22 12:23:40' , 'in')
,('002' , '2022-01-22 11:58:01' , 'out')
,('002' , '2022-01-22 09:30:15' , 'in')
,('002' , '2022-01-21 18:43:29' , 'out')
,('002' , '2022-01-21 13:27:47' , 'in')
,('002' , '2022-01-21 00:18:29' , 'out')

数据分析得出过程:

SELECT id,DATE_FORMAT(date_time,'%Y-%m-%d'),SUM(date_diff)              --每天工作时间累计,7.58-SUM(date_diff)           --每天相差时间
FROM
(
SELECT id,date_time,le_date_time,CASE WHEN DATE_FORMAT(date_time, '%H%i%s') < '085500' THEN   --进入时间小于08:55时CASE WHEN DATE_FORMAT(le_date_time,'%H%i%s') < '085500' THEN NULLWHEN DATE_FORMAT(le_date_time,'%H%i%s') >= '085500' AND DATE_FORMAT(le_date_time,'%H%i%s') < '120000' THEN TIMESTAMPDIFF(SECOND,date_time,le_date_time)/3600WHEN DATE_FORMAT(le_date_time,'%H%i%s') >= '120000' AND DATE_FORMAT(le_date_time,'%H%i%s') < '133000' THEN TIMESTAMPDIFF(SECOND,STR_TO_DATE(DATE_FORMAT(date_time,'%Y-%m-%d 08:55:00'),'%Y-%m-%d %H:%i:%s'),STR_TO_DATE(DATE_FORMAT(le_date_time,'%Y-%m-%d 12:00:00'),'%Y-%m-%d %H:%i:%s'))/3600WHEN DATE_FORMAT(le_date_time,'%H%i%s') >= '133000' AND DATE_FORMAT(le_date_time,'%H%i%s') < '180000' THEN TIMESTAMPDIFF(SECOND,STR_TO_DATE(DATE_FORMAT(date_time,'%Y-%m-%d 08:55:00'),'%Y-%m-%d %H:%i:%s'),le_date_time)/3600 - 1.5              WHEN DATE_FORMAT(le_date_time,'%H%i%s') >= '180000' THEN TIMESTAMPDIFF(SECOND,STR_TO_DATE(DATE_FORMAT(date_time,'%Y-%m-%d 08:55:00'),'%Y-%m-%d %H:%i:%s'),STR_TO_DATE(DATE_FORMAT(le_date_time,'%Y-%m-%d 18:00:00'),'%Y-%m-%d %H:%i:%s'))/3600 -1.5ENDWHEN DATE_FORMAT(date_time,'%H%i%s') >= '085000' AND DATE_FORMAT(date_time,'%H%i%s') < '120000' THEN --进入时间在08:55时 到 12:00时CASE WHEN DATE_FORMAT(le_date_time,'%H%i%s') >= '085500' AND DATE_FORMAT(le_date_time,'%H%i%s') < '120000' THEN TIMESTAMPDIFF(SECOND,date_time,le_date_time)/3600WHEN DATE_FORMAT(le_date_time,'%H%i%s') >= '120000' AND DATE_FORMAT(le_date_time,'%H%i%s') < '133000' THEN TIMESTAMPDIFF(SECOND,date_time,STR_TO_DATE(DATE_FORMAT(le_date_time,'%Y-%m-%d 12:00:00'),'%Y-%m-%d %H:%i:%s'))/3600WHEN DATE_FORMAT(le_date_time,'%H%i%s') >= '133000' AND DATE_FORMAT(le_date_time,'%H%i%s') < '180000' THEN TIMESTAMPDIFF(SECOND,date_time,le_date_time)/3600 - 1.5                WHEN DATE_FORMAT(le_date_time,'%H%i%s') >= '180000' THEN TIMESTAMPDIFF(SECOND,date_time,STR_TO_DATE(DATE_FORMAT(le_date_time,'%Y-%m-%d 18:00:00'),'%Y-%m-%d %H:%i:%s'))/3600 - 1.5END WHEN DATE_FORMAT(date_time,'%H%i%s') >= '120000' AND DATE_FORMAT(date_time,'%H%i%s') < '133000' THEN --进入时间在12:00时 小于 13:30时CASE WHEN DATE_FORMAT(le_date_time,'%H%i%s') >= '120000' AND DATE_FORMAT(le_date_time,'%H%i%s') < '133000' THEN NULLWHEN DATE_FORMAT(le_date_time,'%H%i%s') >= '133000' AND DATE_FORMAT(le_date_time,'%H%i%s') < '180000' THEN TIMESTAMPDIFF(SECOND,STR_TO_DATE(DATE_FORMAT(date_time,'%Y-%m-%d 13:30:00'),'%Y-%m-%d %H:%i:%s'),le_date_time)/3600             WHEN DATE_FORMAT(le_date_time,'%H%i%s') >= '180000' THEN TIMESTAMPDIFF(SECOND,STR_TO_DATE(DATE_FORMAT(date_time,'%Y-%m-%d 13:30:00'),'%Y-%m-%d %H:%i:%s'),STR_TO_DATE(DATE_FORMAT(le_date_time,'%Y-%m-%d 18:00:00'),'%Y-%m-%d %H:%i:%s'))/3600ENDWHEN DATE_FORMAT(date_time,'%H%i%s') >= '130000' AND DATE_FORMAT(date_time,'%H%i%s') < '180000' THEN  --进入时间在13:30时 小于 18:00时CASE WHEN DATE_FORMAT(le_date_time,'%H%i%s') >= '133000' AND DATE_FORMAT(le_date_time,'%H%i%s') < '180000' THEN TIMESTAMPDIFF(SECOND,date_time,le_date_time)/3600 - 1.5               WHEN DATE_FORMAT(le_date_time,'%H%i%s') >= '180000' THEN TIMESTAMPDIFF(SECOND,date_time,STR_TO_DATE(DATE_FORMAT(le_date_time,'%Y-%m-%d 18:00:00'),'%Y-%m-%d %H:%i:%s'))/3600 -1.5ENDEND  AS date_diff
FROM(
SELECT a.id     AS id,a.date_time      AS date_time,a.le_date_time   AS le_date_time,a.out_in_flag    AS out_in_flag
FROM (SELECT id,date_time,lead(date_time,1) over(PARTITION BY id ORDER BY date_time) AS le_date_time  --这里使用lead函数来将进出时间整合到一行,out_in_flagFROM attendance_warning_tb)a
WHERE a.out_in_flag = 'in'
)b
)c
GROUP BY
id,DATE_FORMAT(date_time,'%Y-%m-%d')

根据考勤数据联想关于平时考勤记录异常的数据sql分析相关推荐

  1. 大数据实战-callLog项目(通话记录数据分析)之数据生产

    文章目录 前言 生成基础数据 Maven依赖 姓名-手机号列表 时间维度表 自动随机生成 生成时间戳 生成一定范围内的long数据 代码 调用演示 获得随机的时间戳 代码 调用示例 生成一行记录 打包 ...

  2. ASP.NET Web API 记录请求响应数据到日志的一个方法

    原文:ASP.NET Web API 记录请求响应数据到日志的一个方法 原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-resp ...

  3. 大数据陷阱:谁有权享有大数据,谁有权分析大数据

    既要保持数据的自由流动性,又要维护每个主体在数据上的权益,这是个空前的法律难题.而创制和维护这样的数据利用秩序却是大数据应用的前提,是大数据战略得以实施的根本保证 中国信息通信研究院在第十六届中国互联 ...

  4. 大数据平台的服务内容以及猛犸大数据平台近期的思考【摘录】

    猛犸大数据平台经过去年一年的快速发展,已成为公司内多个产品的大数据开发工具的首选,作为一个当初定位为开发门户的这样一个平台网站,以调度管理为核心,将公司内已有的大数据工具进行了整合,提供了可视化的操作 ...

  5. 中控考勤与海威达C6考勤系统考勤数据同步

    公司的老考勤机坏了,换成中控的S30考勤机了,考勤数据需要合并在一起,特写此存储过程,加入到每天的作业中让其自动执行.考勤统计仍然使用C6的,所以将考勤数据同步到C6的考勤里面. ---------- ...

  6. 从签到卡机数据中看单位人员考勤情况

    我们这里已经获取到了某单位签到卡机导出的数据和单位人员通讯录. 其中签到机导出数据格式为.txt,内容如下图: 其中有价值的信息就数每行的time,id,name了,所以第一步要做的就是从文本中提取出 ...

  7. SAP HR 考勤 PT60执行时报错“在$无工作中心数据 YYYY.MM.DD”问题解决

    该问题出现的原因是:"时间评估的起始日期"小于"入职日期". ["时间评估的起始日期"等于PT数据中最早的"日期".] ...

  8. SAP HR 考勤 PT60执行时报错“在$无工作中心数据 YYYY.MM.DD”问题解决<转载>

    原文链接:https://blog.csdn.net/csucoder_zone/article/details/105042403 该问题出现的原因是:"时间评估的起始日期"小于 ...

  9. android 钉钉考勤日历,vue钉钉考勤日历 vue实现钉钉的考勤日历

    想了解vue实现钉钉的考勤日历的相关内容吗,张张张立宏在本文为您仔细讲解vue钉钉考勤日历的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:vue钉钉考勤日历,vue钉钉考勤,vue考勤日历 ...

最新文章

  1. Python3中lambda表达式介绍
  2. 树莓派学习笔记—— 源代码方式安装opencv
  3. 三数之和为0(c语言实现)(改进)
  4. 谈谈button标签和input标签的区别
  5. 美团门票公布清明假期数据:单日入园人次超200万
  6. 【LOJ119】单源最短路 模板
  7. 记一次服务器被攻击事件
  8. linux_oracle视频讲解百度云,Oracle免费视频课程2012版
  9. HWSD土壤数据库介绍
  10. 未能连接到imap服务器,roundcube无法连接imap服务器登录
  11. CorelDRAW插件-CPG插件开发-环境搭建-VS2017-TLB文件-CDR插件
  12. 关于linux下UART串口编程的困惑
  13. 神经网络中epoch、batch、batchsize
  14. Cobalt Strike Beacon 初探
  15. 天猫精灵 python_GitHub - zhjc1124/tmallgenius: 天猫精灵打卡
  16. 数据预处理--对偏态数据
  17. 绿色版的PDF格式文件转换器
  18. 6.6.2 婚姻信息
  19. python简史_移动恶意软件简史
  20. 架构师之路—理解设计模式

热门文章

  1. 图像检测:SSD系列
  2. 关于龙芯与桥片之间的互联技术
  3. 虚拟服务器怎么替换临时域名,如何启用临时域名登录访问
  4. useradd命令创建用户
  5. 强化学习笔记-08 Planning and Learning
  6. undefined reference to pthread_join
  7. 【Ubuntu】Ubuntu安装安装opencv3.4.5
  8. vue怎么请求后端的图片_Vue向后端请求课程展示
  9. 3.垂直折叠导航菜单
  10. VS2019 使用命令行编译工程sln