本文主要记录下平时工作中考勤统计中的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脚本。相关推荐

  1. 路由器数据统计SQL脚本

    一.路由器部分//[饼图]统计路由器在线.离线数量SELECT COUNT(*) AS total,COUNT(CASE WHEN last_heartbeat_time >= UNIX_TIM ...

  2. oracle执行脚本顺序执行吗,【ORACLE】记录通过执行Oracle的执行计划查询SQL脚本中的效率问题 - 不及格的飞鱼...

    记录通过执行Oracle的执行计划查询SQL脚本中的效率问题 问题现象: STARiBOSS5.8.1R2版本中,河北对帐JOB执行时,无法生成发票对帐文件. 首先,Quartz表达式培植的启动时间为 ...

  3. SQL Server 2016:实时查询统计

    一个数据库查询超时了,而你并不知道原因.估计查询计划可以揭示问题所在,因此,你彻底地消除了超时.但一个小时后,查询还在运行,而你无法获得真正的执行计划.要是有一种方法可以找出服务器内部实际正在发生的事 ...

  4. mysql日期格式化季度_mysql按年度、季度、月度、周、日统计查询的sql语句

    本文介绍一些mysql中用于查询的sql语句,包括按年度.季度.月度.周.日统计查询等,有需要的朋友,可以参考下. 一.年度查询 查询 本年度的数据 SELECT * FROM blog_articl ...

  5. 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 ...

  6. ORACLE数据库查询锁表语句sql脚本,以及删除锁信息脚本(数据库开发ETL、DBA必备)

    ORACLE数据库查询锁表语句sql脚本,以及删除锁信息脚本(数据库开发ETL.DBA必备) 文章目录 ORACLE数据库查询锁表语句sql脚本,以及删除锁信息脚本(数据库开发ETL.DBA必备) 前 ...

  7. oracle当查询没有输出返回0,Oracle导入SQL脚本执行和常用命令大全

    在SQL_PLUS里面执行: sql>@full_path/test.sql; 例:sql>@D:/test.sql; 不需要commit; 一般都是在test.sql 里面最后加上一个c ...

  8. mysql语言中取季度_mysql按年度、季度、月度、周、日统计查询的sql语句

    本文介绍一些mysql中用于查询的sql语句,包括按年度.季度.月度.周.日统计查询等,有需要的朋友,可以参考下. 一.年度查询 查询 本年度的数据 SELECT * FROM blog_articl ...

  9. SQL Server 监控统计阻塞脚本信息

    数据库产生阻塞(Blocking)的本质原因 :SQL语句连续持有锁的时间过长 ,数目过多, 粒度过大.阻塞是事务隔离带来的副作用,它是不可避免的,而且是一个数据库系统常见的现象. 但是阻塞的时间和出 ...

  10. (转)SQL Server 监控统计阻塞脚本信息

    数据库产生阻塞(Blocking)的本质原因 :SQL语句连续持有锁的时间过长 ,数目过多, 粒度过大.阻塞是事务隔离带来的副作用,它是不可避免的,而且是一个数据库系统常见的现象. 但是阻塞的时间和出 ...

最新文章

  1. RDKit | 分子坐标的测量和绘图
  2. GAN眼中的图像翻译(附神奇歌单)
  3. linux bash 写入文件
  4. jzoj4020-Revolution【网络流,最小割】
  5. 【bzoj4386】[POI2015]Wycieczki 矩阵乘法
  6. VC2013生成的程序兼容WindowsXP操作系统
  7. 数据库的备份与恢复技术
  8. 揭开JS加密解密的神秘面纱(1)
  9. OVM虚拟化开启公测,支持Docker全新体验!
  10. Python数据分析与挖掘——回归模型的假设检验
  11. U盘中病毒,文件消失,但U盘的大小却没有改变
  12. 使用华为短信包,发送短信Result=61问题解决
  13. 送你一个励志故事——涵盖20多所互联网公司的校招C++面经
  14. SAP 启动物料帐后不可更改物料价格的处理方法
  15. linux 之atop 系统监控工具
  16. HTC Vive与Oculus Rift全面对比
  17. 2的立方根用计算机怎样摁,用计算器求立方根
  18. c语言 rsa算法 分段,python3 实现RSA算法分段加密解密
  19. [推荐系统] 自己动手写一个推荐系统
  20. 电脑显示WiFi已连接,但无法访问internet怎么解决?

热门文章

  1. 设计一款内容阅读app,要求与市面上的产品有差异化,列举其核心功能,画出页面设计原型图(2-3个),说明其产品价值
  2. matlab中累乘,numpy中的裁剪、压缩和累乘
  3. 如何把pdf拆分成多个文件?
  4. 一文了解大厂的DDD领域驱动设计
  5. openwrt系统安装到云服务器,云服务器安装openwrt
  6. NFS 服务端配置流程
  7. hive清空外部表的三种方式
  8. linux 配置dns域名服务器,linux下DNS配置及域名解析服务
  9. 转载:保护 Web 服务器的安全
  10. 如何授权接入芝麻小客服系统?