统计指定时间段考勤,并且考勤时间以早上6点分段的问题

纸纸纸纸飞飞 2018-02-09 05:37:36
公司员工每天都有多次打卡记录,需要对这些记录进行加工。
正常情况下,都是按日期来取最早的打卡时间作为签到时间,最晚的打卡时间作为签退时间。这种情况下,可以通过一个sql语句解决问题。
假设考勤表为 checkinout,表中有列,一个为员工姓名name,另一个为每次打卡的时间checktime
这样,下面一个sql语句可以搞定:
select name, convert(varchar(100), checktime, 23) checkdate  , min(checktime) checkin, max(checktime) checkout
from checkinout
where checktime >= '2018-01-01'
and checktime < '2018-02-01'
group by name, convert(varchar(100), checktime, 23)
order by name


由于本公司工作的特殊性,经常存在加班到晚上12点后才下班回家的情况。所以,选了一个时间点:早上6点,作为每天打卡的分界线。早上6点之前最晚打卡的记录,作为头一天的签退时间;早上6点之后的最早的打卡时间,作为当天的签到时间。
所以以上的脚本解决不了问题。需要大神们提供帮助。
当前只知道可以通过存储过程来按天进行处理。但不知道是否可以通过一个SQL语句来解决。。。
...全文
694 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
纸纸纸纸飞飞 2018-02-11
  • 打赏
  • 举报
回复
给力,都实现了功能。谢谢大佬们的支持。。。 最后一款速度最快,对于我来说,也最容易理解。
zjcxc 2018-02-11
  • 打赏
  • 举报
回复
把时间减去 6 小时再统计不就行了?
select name, convert(varchar(100), checktime, 23) checkdate  , 
	dateadd(hour, 6, min(checktime)) checkin, 
	dateadd(hour, 6, max(checktime)) checkout
from(
	select dateadd(hour, -6, checkdate) as checkdate from  checkinout
)data
where checktime >= '2018-01-01'
    and checktime < '2018-02-01'
group by name, convert(varchar(100), checktime, 23)
order by name
吉普赛的歌 2018-02-11
  • 打赏
  • 举报
回复
DECLARE @t TABLE (
	[name] NVARCHAR(10),
	checktime DATETIME
)
INSERT INTO @t VALUES ('小明','2018-02-01 07:00')
INSERT INTO @t VALUES ('小明','2018-02-01 18:00')
INSERT INTO @t VALUES ('小红','2018-02-01 07:00')
INSERT INTO @t VALUES ('小红','2018-02-02 01:00')

;WITH cte AS (
select name, CAST(convert(CHAR(10), checktime, 120) AS  DATETIME) checktime
--, min(checktime) checkin, max(checktime) checkout
from @t AS t
WHERE DATEPART(hour,t.checktime)>6
group by name,CAST(convert(CHAR(10), checktime, 120) AS  DATETIME)
)
SELECT 
t.name
,t.checktime
,(SELECT MIN(checktime) FROM @t AS b WHERE 
	b.name=t.name
	--同一天 
	AND convert(CHAR(10), b.checktime, 120)= t.checktime
	--6点之后
	AND b.checktime>convert(CHAR(10), t.checktime, 120)+' 06:00'
	  ) AS checkin
,(SELECT MAX(checktime) FROM @t AS b WHERE 
	b.name=t.name
	--同一天或者后一天 
	AND (
		convert(CHAR(10), b.checktime, 120)= t.checktime
		OR
		convert(CHAR(10), b.checktime, 120)= t.checktime+1
	)
	--必须是后一天6点之前
	AND b.checktime<convert(CHAR(10), t.checktime+1, 120)+' 06:00' 
	) AS checkout
FROM cte AS t

/*
name       checktime               checkin                 checkout
---------- ----------------------- ----------------------- -----------------------
小红         2018-02-01 00:00:00.000 2018-02-01 07:00:00.000 2018-02-02 01:00:00.000
小明         2018-02-01 00:00:00.000 2018-02-01 07:00:00.000 2018-02-01 18:00:00.000
*/
纸纸纸纸飞飞 2018-02-11
  • 打赏
  • 举报
回复
别沉下去了,,,,顶上去。。。
纸纸纸纸飞飞 2018-02-11
  • 打赏
  • 举报
回复
小小感叹一下:思路决定出路,,,
一、项目简介本课程演示的是一套基于SSM实现的考勤管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。课程包含:1. 项目源码、项目文档、数据库脚本、软件工具等所有资料2. 带你从零开始部署运行本套系统3. 该项目附带的源码资料可作为毕设使用4. 提供技术答疑二、技术实现后台框架:Spring、SpringMVC、MyBatisUI界面:JSP、jQuery 、H-ui数据库:MySQL 三、系统功能该系统共包含两种角色:员工、管理员,主要分为前台和后台两大模块。1.前台模块 前台首页、新闻公告、员工活动、职位招聘、留言板、用户注册、用户登录、个人中心、我的考勤、我的奖惩、我的培训、我的薪资、修改密码等功能。2.后台模块 系统后台登陆、管理员管理、员工信息管理、部门管理、职务管理、考勤类别管理、员工考勤管理、员工奖惩管理、员工培训管理、员工薪资管理、网站栏目管理、网站内容管理、职位招聘管理、求职简历管理、留言交流管理、留言回复管理等功能。该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 四、项目截图1)前台首面2)个人信息页面3)员工信息管理4)考勤类别管理5)考勤信息管理6)员工薪资管理  更多Java毕设项目请关注【毕设系列课程】https://edu.csdn.net/lecturer/2104   

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧