考勤查询统计SQL脚本。
本文主要记录下平时工作中考勤统计中的SQL脚本,以便于后续翻阅,同时和大家分享一下,不足的地方还请大牛多多给与点评。
1.首先是查询某员工的考勤记录。可以根据年份,月份,或者时间段查询结果,同时也可以去掉人员筛选条件,查询多个人的考勤结果。以及计算出该员工的打卡是否正常。SQL语句如下所示:
SELECT 员工号,卡号,姓名,日期,'打卡记录' AS 考勤类型,Substring(日期, 1, 4) AS 年份,Substring(日期, 6, 2) AS 月份,Datename(weekday, 日期) AS 工作日类型,Min(打卡时间) AS 上班打卡时间,Max(打卡时间) AS 下班打卡时间,CASEWHEN Datename(weekday, 日期) <> '星期六'AND Datename(weekday, 日期) <> '星期日' THEN( CASEWHEN Min(打卡时间) = Max(打卡时间) THEN'上班或下班忘打卡'WHEN Min(打卡时间) > '08:00:00' THEN '迟到'WHEN Max(打卡时间) < '17:00:00' THEN '早退'ELSE '正常'END )ELSE '非工作日打卡'END AS 状态
FROM (SELECT a.[emp_id] 员工号,a.[card_id] 卡号,b.[emp_fname] 姓名,CONVERT(CHAR(10), sign_time, 120) 日期,CONVERT(VARCHAR, sign_time, 108) 打卡时间,[sign_time]FROM [dbo].[TimeRecords] aLEFT JOIN [dbo].[Employee] bON a.emp_id = b.emp_idAND a.[card_id] = b.[card_id]WHERE a.emp_id IS NOT NULLAND a.emp_id <> ''AND CONVERT(CHAR(10), sign_time, 120) BETWEEN '2018-09-01' AND '2018-10-30'AND b.[emp_fname] = '姓名') AS mm
GROUP BY mm.员工号,卡号,姓名,mm.日期
ORDER BY 员工号,日期 ASC
查询结构如下所示:
2.根据部门,员工姓名、日期查询员工的打卡记录:
SELECT a.emp_fname,b.depart_name,CONVERT(CHAR(10), sign_time, 120) date,Min(c.sign_time) AS BeginTime,Max(c.sign_time) AS EndTimeDatediff(minute, Min(c.sign_time), Max(c.sign_time)) AS minute,
FROM Employee aLEFT JOIN Departs bON a.depart_id = b.depart_idLEFT JOIN TimeRecords cON a.emp_id = c.emp_id
WHERE Substring(a.depart_id, 1, 3) = '041'AND CONVERT(CHAR(10), sign_time, 120) BETWEEN '2018-11-01' AND '2018-11-30'AND a.emp_id IS NOT NULL
GROUP BY depart_name,emp_fname,CONVERT(CHAR(10), sign_time, 120)
ORDER BY depart_name,emp_fname,CONVERT(CHAR(10), sign_time, 120) ASC
查询结果如下所示:
3.统计某一时间段内的员工的上下班打卡次数,以及迟到或早退30分钟以内的和30分钟以上的数据。
SELECT a.emp_fname,b.depart_name,CONVERT(CHAR(10), sign_time, 120) date,Min(c.sign_time) AS BeginTime,Max(c.sign_time) AS EndTimeDatediff(minute, Min(c.sign_time), Max(c.sign_time)) AS minute,
FROM Employee aLEFT JOIN Departs bON a.depart_id = b.depart_idLEFT JOIN TimeRecords cON a.emp_id = c.emp_id
WHERE Substring(a.depart_id, 1, 3) = '041'AND CONVERT(CHAR(10), sign_time, 120) BETWEEN '2018-11-01' AND '2018-11-30'AND a.emp_id IS NOT NULL
GROUP BY depart_name,emp_fname,CONVERT(CHAR(10), sign_time, 120)
ORDER BY depart_name,emp_fname,CONVERT(CHAR(10), sign_time, 120) ASC
SELECT b.emp_fname,b.depart_name,Sum(CASEWHEN ms = 0AND CONVERT(CHAR(10), EndTime, 23) < '12:00:00' THEN 1ELSE 0END) AS 上班未打卡,Sum(CASEWHEN ms = 0AND CONVERT(CHAR(10), EndTime, 23) > '12:00:00' THEN 1ELSE 0END) AS 下班未打卡,Sum(CASEWHEN 540 - ms BETWEEN 0 AND 30 THEN 1ELSE 0END) AS 迟到或早退30分钟以内,Sum(CASEWHEN 540 - ms > 30 THEN 1ELSE 0END) AS 迟到或早退30分钟以上
FROM (SELECT TOP 100 PERCENT a.emp_fname,b.depart_name,Min(c.sign_time) AS BeginTime,Max(c.sign_time) AS EndTime,Datediff(minute, Min(c.sign_time), Max(c.sign_time)) AS msFROM Employee aLEFT JOIN Departs bON a.depart_id = b.depart_idLEFT JOIN TimeRecords cON a.emp_id = c.emp_idWHERE Substring(a.depart_id, 1, 3) = '041'AND CONVERT(CHAR(10), sign_time, 120) BETWEEN '2018-11-01' AND '2018-11-30'AND a.emp_id IS NOT NULLGROUP BY depart_name,emp_fname,CONVERT(CHAR(10), sign_time, 120)ORDER BY depart_name,emp_fname,CONVERT(CHAR(10), sign_time, 120) ASC) AS b
GROUP BY emp_fname,depart_name
ORDER BY depart_name,emp_fname
查询结果如下:
4.统计各种假期的请假时长 :
/****** Script for SelectTopNRows command from SSMS ******/
SELECT applyUser,ApplyDept,Sum(CASEWHEN leavetype = '事假' THEN leaveHoursELSE 0END) AS 事假,Sum(CASEWHEN leavetype = '病假' THEN leaveHoursELSE 0END) AS 病假,Sum(CASEWHEN leavetype = '产检假' THEN leaveHoursELSE 0END) AS 产前病事假,Sum(CASEWHEN leavetype = '产假'OR LeaveType = '陪产假' THEN leaveHoursELSE 0END) AS 产假或护理假,Sum(CASEWHEN leavetype = '婚假' THEN leaveHoursELSE 0END) AS 婚假,Sum(CASEWHEN leavetype = '丧假' THEN leaveHoursELSE 0END) AS 丧假,Sum(CASEWHEN leavetype = '年休假' THEN leaveHoursELSE 0END) AS 年假,Sum(CASEWHEN leavetype = '公假' THEN leaveHoursELSE 0END) AS 公假,Sum(CASEWHEN leavetype = '其他' THEN leaveHoursELSE 0END) AS 其他,Sum(CASEWHEN leavetype = '调休' THEN leaveHoursELSE 0END) AS 调休,Sum(CASEWHEN leavetype = '工伤假' THEN leaveHoursELSE 0END) AS 工伤假
FROM HR_Leave
WHERE CompanyId = 16AND Node = 2AND CONVERT(CHAR(10), Start, 120) BETWEEN '2018-09-01' AND '2018-12-30'
GROUP BY ApplyDept,ApplyUserId,ApplyUser
SQL执行结果如下所示:
5.根据加班类型,统计各种加班类型的加班时长:
/****** Script for SelectTopNRows command from SSMS ******/
SELECT [ApplyUser],[ApplyDept],Sum(CASEWHEN [OtType] = '平时延长' THEN DurationELSE 0END) AS 平时延长,Sum(CASEWHEN [OtType] = '休息日' THEN DurationELSE 0END) AS 休息日,Sum(CASEWHEN [OtType] = '法定节假日' THEN DurationELSE 0END) AS 法定节假日
FROM HR_Overtime
WHERE CompanyId = 16AND Node = 2AND CONVERT(CHAR(10), CreateDateTime, 120) BETWEEN '2018-09-01' AND '2018-12-30'
GROUP BY [ApplyDept],ApplyUserId,[ApplyUser]
查询结果如下所示:
后续持续更新包含请假、加班、出差等相关联的综合查询。注:请假、出差、加班等流程在其他数据库中,几者关联查询不太想用DBLink,所以只有单独查询出来,在代码中用Linq做关联查询,关于跨数据库的关联查询,如果哪位老师有好的建议,欢迎留言。谢谢!
考勤查询统计SQL脚本。相关推荐
- 路由器数据统计SQL脚本
一.路由器部分//[饼图]统计路由器在线.离线数量SELECT COUNT(*) AS total,COUNT(CASE WHEN last_heartbeat_time >= UNIX_TIM ...
- oracle执行脚本顺序执行吗,【ORACLE】记录通过执行Oracle的执行计划查询SQL脚本中的效率问题 - 不及格的飞鱼...
记录通过执行Oracle的执行计划查询SQL脚本中的效率问题 问题现象: STARiBOSS5.8.1R2版本中,河北对帐JOB执行时,无法生成发票对帐文件. 首先,Quartz表达式培植的启动时间为 ...
- SQL Server 2016:实时查询统计
一个数据库查询超时了,而你并不知道原因.估计查询计划可以揭示问题所在,因此,你彻底地消除了超时.但一个小时后,查询还在运行,而你无法获得真正的执行计划.要是有一种方法可以找出服务器内部实际正在发生的事 ...
- mysql日期格式化季度_mysql按年度、季度、月度、周、日统计查询的sql语句
本文介绍一些mysql中用于查询的sql语句,包括按年度.季度.月度.周.日统计查询等,有需要的朋友,可以参考下. 一.年度查询 查询 本年度的数据 SELECT * FROM blog_articl ...
- sql server 统计_看SQL Server 2016中的新实时查询统计信息
sql server 统计 With the release of SQL Server 2016 also comes a great new feature to get a live view ...
- ORACLE数据库查询锁表语句sql脚本,以及删除锁信息脚本(数据库开发ETL、DBA必备)
ORACLE数据库查询锁表语句sql脚本,以及删除锁信息脚本(数据库开发ETL.DBA必备) 文章目录 ORACLE数据库查询锁表语句sql脚本,以及删除锁信息脚本(数据库开发ETL.DBA必备) 前 ...
- oracle当查询没有输出返回0,Oracle导入SQL脚本执行和常用命令大全
在SQL_PLUS里面执行: sql>@full_path/test.sql; 例:sql>@D:/test.sql; 不需要commit; 一般都是在test.sql 里面最后加上一个c ...
- mysql语言中取季度_mysql按年度、季度、月度、周、日统计查询的sql语句
本文介绍一些mysql中用于查询的sql语句,包括按年度.季度.月度.周.日统计查询等,有需要的朋友,可以参考下. 一.年度查询 查询 本年度的数据 SELECT * FROM blog_articl ...
- SQL Server 监控统计阻塞脚本信息
数据库产生阻塞(Blocking)的本质原因 :SQL语句连续持有锁的时间过长 ,数目过多, 粒度过大.阻塞是事务隔离带来的副作用,它是不可避免的,而且是一个数据库系统常见的现象. 但是阻塞的时间和出 ...
- (转)SQL Server 监控统计阻塞脚本信息
数据库产生阻塞(Blocking)的本质原因 :SQL语句连续持有锁的时间过长 ,数目过多, 粒度过大.阻塞是事务隔离带来的副作用,它是不可避免的,而且是一个数据库系统常见的现象. 但是阻塞的时间和出 ...
最新文章
- RDKit | 分子坐标的测量和绘图
- GAN眼中的图像翻译(附神奇歌单)
- linux bash 写入文件
- jzoj4020-Revolution【网络流,最小割】
- 【bzoj4386】[POI2015]Wycieczki 矩阵乘法
- VC2013生成的程序兼容WindowsXP操作系统
- 数据库的备份与恢复技术
- 揭开JS加密解密的神秘面纱(1)
- OVM虚拟化开启公测,支持Docker全新体验!
- Python数据分析与挖掘——回归模型的假设检验
- U盘中病毒,文件消失,但U盘的大小却没有改变
- 使用华为短信包,发送短信Result=61问题解决
- 送你一个励志故事——涵盖20多所互联网公司的校招C++面经
- SAP 启动物料帐后不可更改物料价格的处理方法
- linux 之atop 系统监控工具
- HTC Vive与Oculus Rift全面对比
- 2的立方根用计算机怎样摁,用计算器求立方根
- c语言 rsa算法 分段,python3 实现RSA算法分段加密解密
- [推荐系统] 自己动手写一个推荐系统
- 电脑显示WiFi已连接,但无法访问internet怎么解决?