关于考勤打卡查询sql

Dingzi0312 2009-02-12 04:19:59
id checktime checktype
001 2009-01-21 08:30:48 0
002 2009-01-21 08:30:48 0
003 2009-01-21 80:31:00 0
001 2009-01-21 10:31:48 2
001 2009-01-21 11:31:48 3
002 2009-01-21 14:31:48 2
001 2009-01-21 15:31:48 2

id是员工号,checktime打卡时间 checktype打卡类型 0是上班 2是外出 3是外出返回 1是下班
现在想查询当前在岗的人员记录,也就是包括上班中和外出返回的
但是同一个员工可能外出返回了一次,又再一次外出未返回..
请问sql语句怎么写...
...全文
159 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiguofeng 2009-02-12
  • 打赏
  • 举报
回复

select b.ID
from (
select ID,MAX(checktime) 'dat'
from #PP
group by Id
) a ,#PP b
where b.checktime=a.dat and a.id=b.id and( a.id>2 or a.id<1)
you_tube 2009-02-12
  • 打赏
  • 举报
回复

SELECT T1.id , CASE WHEN ISNULL((INput - out),0) >= 0 THEN '在职' ELSE '外出未归'
end '出勤' FROM ( SELECT id,count(checktype) INput FROM @tab t WHERE checktype = 0
GROUP BY id ) T1
LEFT JOIN (SELECT id,count(checktype) Out FROM @tab t WHERE checktype = 2
GROUP BY id ) T2
ON t1.id = t2.id


不过还要取得刷卡时间最大的数据
you_tube 2009-02-12
  • 打赏
  • 举报
回复

DECLARE @tab TABLE (
id VARCHAR(32),
checktime DATETIME,
checktype int)
INSERT INTO @tab
SELECT '001','2009-01-21 08:30:48',0 UNION ALL
SELECT '002','2009-01-21 08:30:48',0 UNION ALL
SELECT '003','2009-01-21 12:31:00',0 UNION ALL
SELECT '001','2009-01-21 10:31:48',2 UNION ALL
SELECT '001','2009-01-21 11:31:48',3 UNION ALL
SELECT '002','2009-01-21 14:31:48',2 UNION ALL
SELECT '001','2009-01-21 15:31:48',2

SELECT id,CASE WHEN COUNTER >=0 THEN '在职'
ELSE '外出未回'
END

FROM (
SELECT T1.id , ISNULL((INput - out),0) COUNTER FROM (SELECT id,count(checktype) INput FROM @tab t WHERE checktype = 0
GROUP BY id ) T1
LEFT JOIN (SELECT id,count(checktype) Out FROM @tab t WHERE checktype = 2
GROUP BY id ) T2
ON t1.id = t2.id ) T

id 出勤
-------------------------------- --------
001 外出未回
002 在职
003 在职

you_tube 2009-02-12
  • 打赏
  • 举报
回复

DECLARE @tab TABLE (
id VARCHAR(32),
checktime DATETIME,
checktype int)
INSERT INTO @tab
SELECT '001','2009-01-21 08:30:48',0 UNION ALL
SELECT '002','2009-01-21 08:30:48',0 UNION ALL
SELECT '003','2009-01-21 12:31:00',0 UNION ALL
SELECT '001','2009-01-21 10:31:48',2 UNION ALL
SELECT '001','2009-01-21 11:31:48',3 UNION ALL
SELECT '002','2009-01-21 14:31:48',2 UNION ALL
SELECT '001','2009-01-21 15:31:48',2

SELECT * FROM (
SELECT T1.id , ISNULL((INput - out),0) COUNTER FROM (SELECT id,count(checktype) INput FROM @tab t WHERE checktype = 0
GROUP BY id ) T1
LEFT JOIN (SELECT id,count(checktype) Out FROM @tab t WHERE checktype = 2
GROUP BY id ) T2
ON t1.id = t2.id ) T
WHERE COUNTER >= 0

id COUNTER
-------------------------------- -----------
002 0
003 0
Dingzi0312 2009-02-12
  • 打赏
  • 举报
回复
我的意思是在这段时间内,实际在岗的人员,而不是记录
比如001这个人 8:30时在岗, 10点-11点外出又返回了,15点又外出未返回,这样算不在岗
再比如003这个人,8:30-目前,除了上班打卡,再也没有记录,说明一直在岗
ws_hgo 2009-02-12
  • 打赏
  • 举报
回复
这个是在岗的啊
you_tube 2009-02-12
  • 打赏
  • 举报
回复
楼上不对

Dingzi0312 2009-02-12
  • 打赏
  • 举报
回复
id为001的15:31又外出,未返回..说明不在岗啊..??

这个语句没有把这个情况考虑进去吧???
ws_hgo 2009-02-12
  • 打赏
  • 举报
回复
create table #PP
(
ID char(6),
checktime datetime,
checktype int
)
insert into #PP select '001','2009-01-21 08:30:48',0
union all select '002','2009-01-21 08:30:48',0
union all select '003','2009-01-21 08:31:48',0
union all select '001','2009-01-21 10:31:48',2
union all select '001','2009-01-21 11:31:48',3
union all select '002','2009-01-21 14:31:48',2
union all select '001','2009-01-21 15:31:48',2

/*
checktype打卡类型 0是上班 2是外出 3是外出返回 1是下班
现在想查询当前在岗的人员记录,也就是包括上班中和外出返回的
但是同一个员工可能外出返回了一次,又再一次外出未返回..
请问sql语句怎么写...
*/

select * from #PP where checktype in(0,3) and checktime
between '2009-01-21 08:00' and '2009-01-21 17:00'

ID checktime checktype
------ ----------------------- -----------
001 2009-01-21 08:30:48.000 0
002 2009-01-21 08:30:48.000 0
003 2009-01-21 08:31:48.000 0
001 2009-01-21 11:31:48.000 3
Dingzi0312 2009-02-12
  • 打赏
  • 举报
回复
8:00-17:00
ws_hgo 2009-02-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Dingzi0312 的回复:]
就是查询从上班到当前这个时间段内的在岗人数..
[/Quote]
几点到几点
Dingzi0312 2009-02-12
  • 打赏
  • 举报
回复
就是查询从上班到当前这个时间段内的在岗人数..
ws_hgo 2009-02-12
  • 打赏
  • 举报
回复
感觉你的逻辑有问题
应该查询某个时间段的
在岗人数
ws_hgo 2009-02-12
  • 打赏
  • 举报
回复
先看下
一、项目简介本课程演示的是一套基于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   

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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