300分 根据打卡记录自动识别是属于哪个班次,来者人人有分

fa_ge 2008-05-20 12:00:03
--员工表
create table #employee
(id int identity(1,1),gh varchar(10),dept_no varchar(10),name varchar(10))

insert into #employee
select '10001','001','张无忌' union all
select '10002','001','张三丰' union all
select '10003','002','韦小宝' union all
select '10004','002','成近南' union all
select '10005','003','和申'

--部门表
create table #dept
(id int identity(1,1),dept_no varchar(10),dept_name varchar(10))

insert into #dept
select '001','IT部' union all
select '002','产品部' union all
select '003','制造部'

--考勤表

create table #check_work
(id int identity(1,1),person_number varchar(10),type varchar(10),
begindate datetime, --开始考勤时间
enddate datetime --结束考勤时间
)
-- case when type=员工 then person_number=员工编号
-- when type=部门 then person_number=部门编号
insert into #check_work
select '001','部门','2008-05-05 00:00:00','2008-05-09 00:00:00' union all
select '1003','员工','2008-05-05 00:00:00','2008-05-09 00:00:00' union all
select '1004','员工','2008-05-05 00:00:00','2008-05-09 00:00:00' union all
select '1005','员工','2008-05-05 00:00:00','2008-05-09 00:00:00'

--班次表
create table #workset(id int identity(1,1),
workset_number varchar(10), --班次编号
workset_name varchar(20), --班次名称
begindate varchar(5),enddate varchar(5), --上班时间,下班时间
begindate1 varchar(5),enddate1 varchar(5) , --上班打卡起始时间和上班打卡结束时间
begindate2 varchar(5),enddate2 varchar(5), --下班打卡起始时间和下班打卡结束时间
rest_begin1 varchar(5),rest_end1 varchar(5) --中间休息起始时间和结束时间 ,在这里暂不考虑
)

insert into #workset
select '01','管理干部','09:00','18:00','06:00','09:00','18:00','23:59','12:00','13:00' union all --干部班次一天只打两次卡
select '02','员工正常班次一','08:00','11:30','07:00','08:00','11:30','12:00','','' union all --这个班次没有休息时间
select '03','员工正常班次二','13:00','17:30','12:00','13:00','17:30','17:59','','' union all --这个班次没有休息时间
select '04','冲压车间夜班班次','20:00','04:30','19:30','20:00','04:30','05:00','23:00','00:00'

--打卡记录表
create table #ropen
(id int identity(1,1),
gh varchar(10), --员工工号
open_time datetime --打卡时间
)

insert into #ropen
select '10001','2008-05-05 08:54:00.000' union all --从这开始部门为IT部,属干部班次 09:00-18:00
select '10001','2008-05-05 08:58:00.000' union all
select '10001','2008-05-05 18:04:00.000' union all
select '10002','' union all --10002 上午没打上卡
select '10002','2008-05-05 18:15:00.000' union all
select '10002','2008-05-05 18:20:00.000' union all

select '10003','2008-05-05 07:54:00.000' union all --从这开始是员工班次, 08:00-11:30,13:00=17:30
select '10003','2008-05-05 11:40:00.000' union all
select '10003','2008-05-05 12:54:00.000' union all --10003 第二个正常班次打卡记录
select '10003','2008-05-05 17:30:00.000' union all
select '10003','2008-05-05 17:54:00.000' union all
select '10004','2008-05-05 07:58:00.000' union all
select '10004','' union all --10004第一个班次下班没有打上卡
select '10004','2008-05-05 12:54:00.000' union all
select '10004','2008-05-05 17:54:00.000' union all

select '10005','2008-05-05 19:58:00.000' union all --从这开是夜班 20:00-04:30
select '10005','2008-05-06 04:51:00.000'

--drop table #employee,#dept,#check_work,#workset,#ropen



根据#check_work表中排了考勤的员工的打卡记录自动
得到 10001,10002是属于'01'班次
10003,10004是属于 '02','03'班次
10005 是属于'04'班次
第一次弄考勤,任务崔得太急了。c友们帮我看看,提提建义也好。
来者都是客,人人有分。
...全文
1428 180 打赏 收藏 转发到动态 举报
写回复
用AI写文章
180 条回复
切换为时间正序
请发表友善的回复…
发表回复
xsz621 2008-06-02
  • 打赏
  • 举报
回复
学习中
jhwcd 2008-05-30
  • 打赏
  • 举报
回复
学习中,楼主弄好了代码分享一下。
smilyvm 2008-05-30
  • 打赏
  • 举报
回复
帮顶
laowan688 2008-05-30
  • 打赏
  • 举报
回复
http://download.csdn.net/source/473058
CSDN不错的免费资源。拿来与大家分享,包括sql实例集锦,sql的基本知识(包括视图,触发器,索引,以及sql的基本知识)。相信能给您带来实惠。
xiao_yi 2008-05-30
  • 打赏
  • 举报
回复
所谓的考勤,是不是有点类似于绩效考核???

只是学生不拿工资罢了....
fa_ge 2008-05-29
  • 打赏
  • 举报
回复
几天没来又多了许多回复,谢谢大家关注.
wzjpsq 2008-05-29
  • 打赏
  • 举报
回复
再学习
Edidu 2008-05-29
  • 打赏
  • 举报
回复
人人有分,不顶傻瓜。

没有做过,关注中....
dlpseeyou 2008-05-28
  • 打赏
  • 举报
回复
看看
shirley_yue 2008-05-28
  • 打赏
  • 举报
回复
学习。。。
hunhun02 2008-05-28
  • 打赏
  • 举报
回复
[Quote=引用 85 楼 fcuandy 的回复:]
这种问题需要人工核查的,不能完全依赖于程序。

比如很简单的一个例子,某一人,第一天正常上班,下班未打卡,第二天上班未打卡,第二天下班打卡,依程序你无法判断他是从第一天一直加班上到第二天,还是中间有离开。

或者是第一天上班未打卡,下班打了卡,第二天上班打了卡,下班又未打卡, 是程序来做,又会把它认作是上晚班,这明显不对的。
[/Quote]

这个问题好解决,只要是设置成每天12点自动统计一次
如果12点之前没打开,就算你下班没打卡……
不过确实是最后很多东西要和人工结合的
当时我们打指纹
我们几个合伙糊弄公司,不同的手指是不同的同事的
hunhun02 2008-05-28
  • 打赏
  • 举报
回复
学习
zhou968 2008-05-28
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 Herb2 的回复:]
如果上下班都不打卡,如果只打一次卡,而又没有办法判断是哪个班次就没办法了。

SQL code
--获得需要检查的数据#c
select gh,b=begindate,e=enddate into #c from #employee a,#check_work b where (case when type = '员工' then a.gh else a.dept_no end) = b.person_number

--获得检查范围内的打卡数据#d
select gh,d=convert(char(10),open_time,120),t= convert(char(8),open_time,108) into #d from #ropen a

[/Quote]
ChinaJiaBing 2008-05-28
  • 打赏
  • 举报
回复
学习学习
suifeng108 2008-05-28
  • 打赏
  • 举报
回复
每个班次应该要设定不同的打卡时间范围,不然怎么分的清?
不过这个做法是很难操作的
swot2008 2008-05-28
  • 打赏
  • 举报
回复
up
libb00 2008-05-27
  • 打赏
  • 举报
回复
这个问题很难办吧
有人请假,旷工就没法判断了
换个思路
wgh88888888 2008-05-27
  • 打赏
  • 举报
回复
方法:
先通过行列转换,把打卡时间编排成表A:

员工 日期 时间1 时间2 时间3 时间3 时间4 时间5 时间6
-----------------------------------------------------------------
A01 2008/1/1 08:00 12:00 17:30
A02 2008/1/1 07:00 11:00 13:30 18:00
....
....
再哪表A与班次表各个班次时间段相减,把各个时段差值相加,取最小值,这样可以坚决常规的自动匹配班次问题,
当然,如特殊情况:上班超过24小时,或保安班次:上午8点上班到第二天8点,这样就无法使用自动匹配班次功能。
云飞扬77 2008-05-27
  • 打赏
  • 举报
回复
学习
zy2419 2008-05-27
  • 打赏
  • 举报
回复
学习了……
加载更多回复(160)

34,590

社区成员

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

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