sql求解:查询连续七天以上都有打卡的员工记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql求解:查询连续七天以上都有打卡的员工记录相关的知识,希望对你有一定的参考价值。

最近公司在做EICC认证,连续上班七天是不允许的,所以今天接到人事部的一道题,可把我难倒了,特来此求解:

比如要查出六月份连续七天都有打卡的员工

请问这个存储过程该怎麼写?

有思路也行!

帮忙解决问题后追加100分,绝不食言!

--给你个基本的查询结构和思路说明,你按自己的表结果做一下调整就OK
--建立游标的查询忽略了过滤一天内多次打卡,请根据自己表结构进行过滤
declare @c1 varchar(50)
declare @time1 varchar(50)
declare @工号 varchar(50)
declare @time2 varchar(50)
declare @i int --连续打卡天数
--
--建立游标,查询按工号和打卡时间排序
DECLARE f_Cursor CURSOR FOR SELECT 员工工号 FROM 打卡表,打卡时间 where (打卡时间 between '时间1' and '时间2') order by 员工工号 ,打卡时间
--建立临时表,留备记录
create table #table (工号 varchar(50),连续打卡天数 varchar(50))

OPEN f_Cursor
set @工号 = ''
set @i=0
FETCH NEXT FROM f_Cursor into @c1 ,@time1
--set @工号=@c1
set @time2=@time1
WHILE @@FETCH_STATUS = 0
BEGIN
if @工号=@c1 --判断取出的记录工号与暂存工号相同,
begin
--当时间间隔为1天,连续打卡天数加1;
if datediff(day,@time2,@time1)=1
set @i=@i+1
else
begin
--判断是否超过7天,超过则写入记录,再将连续打卡天数重置为1
if @i>=7
insert into #table (工号,连续打卡天数) values (@工号,@i)
set @i=1
end
set @time2=@time1
end
else --工号不同,连续打卡天数重新为1,分析之前的员工是否连续打卡7天,并进行记录
--完成后将新获得的工号及打卡时间传入暂存工号
begin
if @i>=7 --写入超过7天的工号及天数数据
insert into #table (工号,连续打卡天数) values (@工号,@i)
--将新的工号和打卡时间传入
set @工号=@c1
set @time2 =@time1
set @i=1
end
FETCH NEXT FROM f_Cursor into @c1,@time1
END
CLOSE f_Cursor
DEALLOCATE f_Cursor

--得到查询结果
select * from #table
drop table #table
参考技术A 可以利用一下ORACLE的ROWNUM机制来做点文章,因为它是自增的
我假设有这一张表 WORK
ID,上班日期(DA)
1,20080101
1,20080102
1,20080103
2,20080101
2,20080103
3,20080101
也可能是乱序的
第一步:排序
SELECT * FROM WORK ORDER BY ID, DA
第二步:日期-ROWNUM如果相同的话认为他们是连续的,然后GORUP BY一下
SELECT A.*, TO_NUMBER (A.DA - ROWNUM) DAYS
FROM (SELECT * FROM WORK ORDER BY ID, DA) A
第三步:分别求出连续区间,让他们相减求出大于6的值
SELECT C.ID
(SELECT B.ID, (MAX (B.DA) - MIN (B.DA)) DAYS
FROM (SELECT A.*, TO_NUMBER (A.DA - ROWNUM) DAYS
FROM (SELECT * FROM WORK ORDER BY ID, DA) A) B
GROUP BY B.ID, B.DAYS) C
WHERE C.DAYS > 7

ITPUB一位高人的办法得到了启发

参考资料:http://blog.itpub.net/post/5042/27936

参考技术B 按7天时间段 以及,员工 来group by , 然后count()打卡记录 参考技术C 把表结构发出来看下 参考技术D 请把表结构 发出来....

关于MSSQL1个查询命令

这是1个考勤数据库的表;
表是这样的:
ID FdateTime CardNo MachNo EmpID FType

我想查询里面的打卡记录 是什么命令 (我记得前面是 WHere fdatetime 后面不记得了)
select * from (表名) where fdatetime 后面的是什么 要怎么写
按着时间 工号 打卡机编号 这些条件来查询某一个工号的考勤记录

select * from (表名) where EmpID=\'某员工工号\' order by FdateTime
,EmpID

你那个日期字段要看你表中是什么格式的?
或者fdatetime=\'2009-04-28\'?
你还是先自己弄清楚吧
参考技术A select * from table where fdatetime >'2208-8-8' 参考技术B 有另外一个方法,不要用查询分析器,你打开企业管理器,在打开这个考勤数据库,然后找到你要查的表名,然后打开,然后一列一列的看好了,总有你想要的。

以上是关于sql求解:查询连续七天以上都有打卡的员工记录的主要内容,如果未能解决你的问题,请参考以下文章

sql查询一段时期里每一天所有员工的打卡记录

用 sqlserver 怎样查询出 数据表里 某月上班连续打卡15天的人

[5]Java开发实习面试打卡

[5]Java开发实习面试打卡

[5]Java开发实习面试打卡

sql统计连续相同数值的次数