判断迟到早退的SQL语句

wengqihan8 2014-11-22 08:01:00
表一:
员工姓名 员工工号 刷卡时间
蔡燕 20513 2014-6-27 08:40:45
蔡燕 20513 2014-6-27 17:50:47
蔡燕 20513 2014-6-28 8:14:54
蔡燕 20513 2014-6-28 8:19:54
蔡燕 20513 2014-6-28 18:14:54
艾云东 11304 2014-06-27 16:40:50
艾云东 11304 2014-06-27 17:40:50

我筛选出每个员工,每天的上班情况,7点到12点算上班打卡,16点以后算下班打卡,多次刷卡取最早的打卡时间为上班卡,取最晚时间为下班卡,如果在该时间段未存在打卡记录即显示未打卡,8点30之后打卡算迟到,18点之前上班算早退吗,得出类似下表:
日期 员工姓名 上班 下班 是否迟到 是否早退
2014-6-27 秦燕 2014-6-27 08:40:45 2014-6-27 18:20:47 迟到 早退
2014-6-27 艾云东 未打卡 2014-06-27 17:40:50 未打卡 早退
2014-6-28 秦燕 2014-6-28 8:14:54 2014-6-28 18:14:54
……
...全文
1240 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jamesking 2014-12-17
  • 打赏
  • 举报
回复
重复打卡怎么算?8点打了,9点又打一次
sharelove 2014-11-25
  • 打赏
  • 举报
回复
先把列转成行,求出每个时段最小值和最大值,然后 再根据每列的情况做个计算!
Q315054403 2014-11-23
  • 打赏
  • 举报
回复
写个“有技巧”的SQL不是解决之道 考勤是个设计问题,而非SQL问题 涉及的内容较繁杂,如班次、补卡、调班、假日等
Neo_whl 2014-11-22
  • 打赏
  • 举报
回复
这位兄弟,问题解决没有啊,也不结贴,也不追问。。。
还在加载中灬 2014-11-22
  • 打赏
  • 举报
回复
SELECT [日期],员工姓名,员工工号,[上班],[下班]
	,CASE WHEN[上班]='未打卡'THEN'未打卡'
		WHEN[上班]>[日期]+' 08:30:00'THEN '迟到'
		ELSE''
	END[是否迟到]
	,CASE WHEN[下班]='未打卡'THEN'未打卡'
		WHEN[下班]<[日期]+' 18:00:00'THEN '早退'
		ELSE''
	END[是否迟到]
FROM(
	SELECT CONVERT(VARCHAR(10),刷卡时间,120)[日期],员工姓名,员工工号
		,ISNULL(CONVERT(VARCHAR(50),MIN(CASE WHEN 刷卡时间
				BETWEEN CONVERT(VARCHAR(10),刷卡时间,120)+' 07:00:00'
				AND CONVERT(VARCHAR(10),刷卡时间,120)+' 12:00:00'
			THEN 刷卡时间 END),120),'未打卡')[上班]
		,ISNULL(CONVERT(VARCHAR(50),MAX(CASE WHEN
			刷卡时间>=CONVERT(VARCHAR(10),刷卡时间,120)+' 16:00:00'
			THEN 刷卡时间 END),120),'未打卡')[下班]
	FROM #TB
	GROUP BY CONVERT(VARCHAR(10),刷卡时间,120),员工姓名,员工工号
)T

27,581

社区成员

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

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