--给你个基本的查询结构和思路说明,你按自己的表结果做一下调整就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
可以利用一下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一位高人的办法得到了启发
按7天时间段 以及,员工 来group by , 然后count()打卡记录
把表结构发出来看下
请把表结构 发出来....