一个关于数据库查询的问题(SQL语言)

tgc19810107 2004-03-22 10:27:00
有一个表EmpWork(EmpId,WorkDate,Worked),EmpWork表示员工工作表,表有三个字段:EmpId表示职工号,WorkDate表示日期,Worked为出勤标识(1表示当天出勤,0表示当天未出勤)。现要求查询出在2004年3月中连续出勤超过10天的员工的EmpId,请各位大侠指教。请注意,为“连续”出勤。
...全文
48 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
tgc19810107 2004-03-23
  • 打赏
  • 举报
回复
这道题果然满繁的,希望大家用vb继续发言
yoki 2004-03-23
  • 打赏
  • 举报
回复
?????
junglerover 2004-03-23
  • 打赏
  • 举报
回复
TO tgc19810107(城市包围农村):
什么叫做“这道题果然满繁的,希望大家用vb继续发言”?

如果你的WorkDate字段是CHAR型,那么可以直接用我上面提供的自定义函数;
如果你的WorkDate字段是Datetime型,那么可以直接用yoki(小马哥--鬓微霜,又何妨) 提供的存储过程;
如果你的数据库不是SQL SERVER,那么你看了上述代码之后,也应该可以很容易地写出一个存储过程,或自定义函数来解决。

有什么繁的?
yoki 2004-03-23
  • 打赏
  • 举报
回复
把我上述的代码写成一个存储过程,然后在vb中调用即可
julieyan 2004-03-23
  • 打赏
  • 举报
回复
增加个字段,再编个触发器
yoki 2004-03-22
  • 打赏
  • 举报
回复
再改一下:
select *,0 as Ep into #temp from EmpWork
where convert(char(7),workdate,120)='2004-03'
order by empid,workdate

declare @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
yoki 2004-03-22
  • 打赏
  • 举报
回复
select *,0 as Ep into #temp from EmpWork
where convert(char(7),workdate,120)='2004-03'
order by empid,workdate

declare @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
yoki 2004-03-22
  • 打赏
  • 举报
回复
select *,0 as Ep into #temp from EmpWork order by empid,workdate

declare @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
yoki 2004-03-22
  • 打赏
  • 举报
回复
增加一个字段放连续出勤天数
junglerover 2004-03-22
  • 打赏
  • 举报
回复
再解释一下:

函数WorkContinued如果返回1表示此员工满足在此月内连续工作N天,返回0表示不满足。

其中的关键SQL语句:
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,则说明其未连续工作。
junglerover 2004-03-22
  • 打赏
  • 举报
回复
以下假定你的表中,workdate 是VARCHAR(10),即形如 '2004-03-01' 一样的字符型字段,
worked是整型字段。

函数体如下:

--此函数判断某员工,在某月,是否连续工作了N天以上
CREATE FUNCTION WorkContinued(
@strEmpID varchar(50),
@strMonth varchar(7),
@intDayCount int)
RETURNS int AS
begin

declare @WorkDate Varchar(10)
declare @WorkDayCount int
declare @Result int

DECLARE Workdate_Cur CURSOR
FOR SELECT workdate FROM EmpWork
where empid=@strEmpID and workdate like @strMonth+'%' and worked=1
order by workdate

set @Result=0

open 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
end

close WorkDate_Cur
deallocate WorkDate_Cur
return @Result
End

创建此函数后,使用

select distinct empid from empwork
where dbo.WorkContinued(empid ,'2004-03',10)=1

我已经测试通过。当然,如果你的workdate是 datetime 型,就需要对函数体进行一些修改了。
junglerover 2004-03-22
  • 打赏
  • 举报
回复
如果你是使用SQL SERVER 2000,那么可以考虑写一个自定义函数来实现。即通过一个自定义函数判断某员工是否满足“连续出勤10天”的条件。

然后在SQL语句中调用这个自定义函数就可以了。
strongfisher 2004-03-22
  • 打赏
  • 举报
回复
你这样吧
查一个人的不出勤天数,最小的一个和第一天比较大于十天不用说了
小于则从这天开始从新判断
一个sql肯定不成了
tgc19810107 2004-03-22
  • 打赏
  • 举报
回复
victorycyz(中海) ,用游标可以么?怎么用啊?
benjamin8064 2004-03-22
  • 打赏
  • 举报
回复
想了半天,还是没有想出来,关注一下吧
victorycyz 2004-03-22
  • 打赏
  • 举报
回复

用游标吧。
_foo 2004-03-22
  • 打赏
  • 举报
回复
mark
qinyonlhm 2004-03-22
  • 打赏
  • 举报
回复
其它的还好说,你个这连续出勤就不知道了。
学习
RUKYO 2004-03-22
  • 打赏
  • 举报
回复
Mark

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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