不考虑加班,请假,外出之类。
原始记录表:
1:工作日历表calendar
2:排班表worktime
3:人事资料表employee
4:异常类别表(迟到,早退,无刷卡...)abnormity
5:考勤记录表timecard
处理结果表:(可以用表或视图的形式存放)
1: 打卡异常 10001 20031102 上午上班 迟到
2:考勤明细表1: 10001 20031101 07:55/12:01/12:02/13:55/18:00/18:01 列出所有打卡明细
3:考勤明细表2: 10001 20031101 07:55 12:01 13:55 18:00
/*工作日历表:
如下假设只有三种工作日历,默认情况如下
1:星期六和星期天不上班
2:星期天不上班
4:每天都上班
*/
create table calendar(
date smalldatetime primary key clustered,
flag1 bit,
flag2 bit,
flag3 bit
)
exec sp_addextendedproperty n'ms_description', n'日期', n'user', n'dbo', n'table', n'calendar', n'column', n'date'
exec sp_addextendedproperty n'ms_description', n'是否上班1', n'user', n'dbo', n'table', n'calendar', n'column', n'flag1'
exec sp_addextendedproperty n'ms_description', n'是否上班2', n'user', n'dbo', n'table', n'calendar', n'column', n'flag2'
exec sp_addextendedproperty n'ms_description', n'是否上班3', n'user', n'dbo', n'table', n'calendar', n'column', n'flag3'
/* 个别录入资料
insert calendar select '20031101',0,1,1
union all select '20031102',0,0,1
union all select '20031103',1,1,1
union all select '20031104',1,1,1
*/
/*********如下存储过程用于批量录入资料**************/
create procedure addworkcalendar @bdate smalldatetime,@edate smalldatetime
as
declare @cdate smalldatetime
declare @flag1 bit
declare @flag2 bit
declare @flag3 bit
set @cdate = @bdate
if exists (select * from calendar where cld_rq between @bdate and @edate)
begin
raiserror('已有该范围的资料,请核对开始日期和结束日期!!!',16,-1)
return
end
while @cdate <= @edate
begin
set @flag1 = (case when datepart(weekday,@cdate) in (1,7) then 0 else 1 end)
set @flag2 = (case when datepart(weekday,@cdate)=1 then 0 else 1 end)
set @flag3 = 1
insert calendar values(@cdate,@flag,@flag1,@flag2)
set @cdate = dateadd(day,1,@cdate)
end
/******** usage:
exec addworkcalendar '20031101','20031130'
*********/
/*************
当然,更灵活的方法是如下方式建表:
日期 方式 标志
20011101 1 0
20011101 2 1
20011101 3 1
...
********************/
/*
2:排班表(为简单起见,不考虑加班的排班,且只考虑一天最多需四次刷卡的情况)
*/
create table worktime(
worktimeid int primary key clustered,
minb char(5),
mins char(5),
mine char(5),
moutb char(5),
mouts char(5),
moute char(5),
ainb char(5),
ains char(5),
aine char(5),
aoutb char(5),
aouts char(5),
aoute char(5)
)
go
exec sp_addextendedproperty n'ms_description', n'班制编号', n'user', n'dbo', n'table', n'worktime', n'column', n'worktimeid'
exec sp_addextendedproperty n'ms_description', n'上午上班始', n'user', n'dbo', n'table', n'worktime', n'column', n'minb'
exec sp_addextendedproperty n'ms_description', n'上午上班标准', n'user', n'dbo', n'table', n'worktime', n'column', n'mins'
exec sp_addextendedproperty n'ms_description', n'上午上班止', n'user', n'dbo', n'table', n'worktime', n'column', n'mine'
exec sp_addextendedproperty n'ms_description', n'上午下班始', n'user', n'dbo', n'table', n'worktime', n'column', n'moutb'
exec sp_addextendedproperty n'ms_description', n'上午下班标准', n'user', n'dbo', n'table', n'worktime', n'column', n'mouts'
exec sp_addextendedproperty n'ms_description', n'上午下班止', n'user', n'dbo', n'table', n'worktime', n'column', n'moute'
exec sp_addextendedproperty n'ms_description', n'下午上班始', n'user', n'dbo', n'table', n'worktime', n'column', n'ainb'
exec sp_addextendedproperty n'ms_description', n'下午上班标准', n'user', n'dbo', n'table', n'worktime', n'column', n'ains'
exec sp_addextendedproperty n'ms_description', n'下午上班止', n'user', n'dbo', n'table', n'worktime', n'column', n'aine'
exec sp_addextendedproperty n'ms_description', n'下午下班始', n'user', n'dbo', n'table', n'worktime', n'column', n'aoutb'
exec sp_addextendedproperty n'ms_description', n'下午下班标准', n'user', n'dbo', n'table', n'worktime', n'column', n'aouts'
exec sp_addextendedproperty n'ms_description', n'下午下班止', n'user', n'dbo', n'table', n'worktime', n'column', n'aoute'
/*
注:在上班始-上班标准间打卡属于正常打卡,在上班标准-上班止间打卡属于迟到
在下班始-下班标准间打卡属于早退,在下班标准-下班止间打卡属于正常打卡
其余时间打卡属于无效打卡。
*/
--3:人事资料表(只列出与考勤有关的字段)
create table employee(
workno char(6) primary key,