有一个表EmpWork(EmpId,WorkDate,Worked),EmpWork表示员工工作表,表有三个字段:EmpId表示职工号,WorkDate表示日期,Worked为出勤标识(1表示当天出勤,0表示当天未出勤)。现要求查询出在2004年3月中连续出勤超过10天的员工的EmpId,请各位大侠指教。请注意,为“连续”出勤。
解决方案 »
- 100急求后面是lang的汉化文件有关什么打开
- 求助帮忙
- 这是什么东东?一个初学者的疑惑!
- 溢出问题,初学VB.
- 我用VB+Acess做了个数据库。用setup factory打包后在没有VB和Access的机中不能使用。
- 打包的问题!急急急!
- 获取windows 版本号的问题
- 什么翻译软件好?
- 哪里有ie6.0英文版的下载???? @@@不是微软网站的那个在线安装版本!!要一次可以下载的*****************************300分************************************8
- command的结果给datagrid为何出错?
- 怎样使我用VB做的窗体位于最前,就像QQ那样
- 高手请帮忙:怎样改变vsflehgrid控件的行高?
查一个人的不出勤天数,最小的一个和第一天比较大于十天不用说了
小于则从这天开始从新判断
一个sql肯定不成了
worked是整型字段。函数体如下:--此函数判断某员工,在某月,是否连续工作了N天以上
CREATE FUNCTION WorkContinued(
@strEmpID varchar(50),
@strMonth varchar(7),
@intDayCount int)
RETURNS int AS
begindeclare @WorkDate Varchar(10)
declare @WorkDayCount int
declare @Result intDECLARE Workdate_Cur CURSOR
FOR SELECT workdate FROM EmpWork
where empid=@strEmpID and workdate like @strMonth+'%' and worked=1
order by workdateset @Result=0open WorkDate_Cur
FETCH NEXT FROM WorkDate_Cur INTO @WorkDate
while @@Fetch_status=0
begin
Select @WorkDayCount=sum(worked) from EmpWork
where empid=@strEmpID and workdate like @strMonth+'%'
and workdate>=@WorkDate and workdate<convert(varchar(10),Cast(@WorkDate as datetime)+@intDayCount,121) if @WorkDayCount>=@intDayCount
begin
set @Result=1
break
end FETCH NEXT FROM WorkDate_Cur INTO @WorkDate
endclose WorkDate_Cur
deallocate WorkDate_Cur
return @Result
End创建此函数后,使用select distinct empid from empwork
where dbo.WorkContinued(empid ,'2004-03',10)=1我已经测试通过。当然,如果你的workdate是 datetime 型,就需要对函数体进行一些修改了。
Select @WorkDayCount=sum(worked) from EmpWork
where empid=@strEmpID and workdate like @strMonth+'%'
and workdate>=@WorkDate and workdate<convert(varchar(10),Cast(@WorkDate as datetime)+@intDayCount,121)是判断从该员工某个工作日开始,其后N天是否连续工作。其原理是,由于Worked字段1表示工作,0表示不工作,那么从某个工作日开始,到其后N天,其Worked字段值SUM后等于N,则说明此员工这N天一直在连续工作;如果小于N,则说明其未连续工作。
update #temp set @a=case when @b= empid and @c=1 then @a+1 else 0 end, @b=empid,@c=worked,ep=@a
select distinct empid from #temp where worked=1 and ep=9
where convert(char(7),workdate,120)='2004-03'
order by empid,workdatedeclare @a int,@b int,@c bit
update #temp
set @a=case when @b= empid and @c=1 then @a+1 else 0 end, @b=empid,@c=worked,ep=@a
select distinct empid from #temp where worked=1 and ep=9
select *,0 as Ep into #temp from EmpWork
where convert(char(7),workdate,120)='2004-03'
order by empid,workdatedeclare @a int,@b int
update #temp set @a=case when @b= empid and worked=1 then @a+1 else 0 end, @b=empid,ep=@a
select distinct empid from #temp where worked=1 and ep=9
什么叫做“这道题果然满繁的,希望大家用vb继续发言”?如果你的WorkDate字段是CHAR型,那么可以直接用我上面提供的自定义函数;
如果你的WorkDate字段是Datetime型,那么可以直接用yoki(小马哥--鬓微霜,又何妨) 提供的存储过程;
如果你的数据库不是SQL SERVER,那么你看了上述代码之后,也应该可以很容易地写出一个存储过程,或自定义函数来解决。有什么繁的?