一個簡單的考勤系統 (轉)
不考慮加班,請假,外出之類。
原始記錄表:
1:工作日曆表calendar
2:排班表worktime
3:人事資料表employee
4:異常類別表(遲到,早退,無刷卡...)abnoty
5:考勤記錄表timecard
處理結果表:(可以用表或檢視的形式存放)
1: 打卡異常 10001 1102 上午上班 遲到
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'o', 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 '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,
[name] varchar(10),
calendarFlag int check(calendarFlag in (1,2,3) ), -- 1,2,3分別表示工作日曆中的標誌1,標誌2,標誌3
worktimeid int -- 排班表中的班制
)
go
exec sp_addextendedproperty N'MS_Description', N'工號', N'user', N'dbo', N'table', N'employee', N'column', N'workno'
exec sp_addextendedproperty N'MS_Description', N'姓名', N'user', N'dbo', N'table', N'employee', N'column', N'name'
exec sp_addextendedproperty N'MS_Description', N'工作日曆方式', N'user', N'dbo', N'table', N'employee', N'column', N'calendarFlag'
exec sp_addextendedproperty N'MS_Description', N'班制', N'user', N'dbo', N'table', N'employee', N'column', N'worktimeid'
/*
calendarFlag 1,2,3分別表示工作日曆中的標誌1,標誌2,標誌3
worktimeid 對應排班表中的班制
*/
--4:異常類別表abnormity
create table abnormity(
abnormityno int primary key clustered,
[description] varchar(10)
)
go
exec sp_addextendedproperty N'MS_Description', N'異常類別', N'user', N'dbo', N'table', N'abnormity', N'column', N'abnormityno'
exec sp_addextendedproperty N'MS_Description', N'異常說明', N'user', N'dbo', N'table', N'abnormity', N'column', N'description'
/**************
異常包括:遲到(還可細分成遲到的時間段),早退,無刷卡...
當然可能還有扣薪方式之類的,此處不予考慮。
*****************/
5:考勤記錄表timecard
create table timecard(
workno char(6),
[date] datetime,
constraint [pk_timecard] primary key clustered
(
workno,
[date]
) ON [PRIMARY]
)
go
exec sp_addextendedproperty N'MS_Description', N'工號', N'user', N'dbo', N'table', N'timecard', N'column', N'workno'
exec sp_addextendedproperty N'MS_Description', N'打卡時間', N'user', N'dbo', N'table', N'timecard', N'column', N'date'
/*******
其實我實際中是按卡號(對應工號),日期,時間,卡鍾號 四個欄位來存的。
*******/
/****************如下處理得到 考勤明細表1:**********/
--1.建立一個合併的
create function f_kqlist(@workno char(6),@date char(8))
returns varchar(400)
as
begin
declare @str varchar(1000)
set @str=''
select @str=@str+'/'+ convert(char(8),[date],108) from timecard
where workno = @workno and datediff(day,[date], @date) = 0
set @str=right(@str,len(@str)-1)
return(@str)
End
/* Usage:
select distinct workno,date,dbo.f_kqlist(workno,[date])
from timecard
where workno = '102337' and convert(char(8),[date],112) = '20030814'
*/
剩下的留給大家吧。其實也不難,就看誰的比較高一些罷了。 :D
(我的做法: 異常處理 : 用儲存過程,用遊標做的,懶得去了
考勤明細表2: 用函式,原來用遊標,不好,後來才改用函式的)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-963141/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一個簡單的Webmail系統 (轉)WebAI
- 一個簡簡單單的紅點系統框架框架
- 一個簡單的業務系統的疑問
- 設計一個簡單的devops系統dev
- 一個簡單的完整人臉識別系統
- 一個簡單的解密程式 (轉)解密
- 考勤系統+(小專案)
- JadeClass 考勤管理系統
- 資訊系統考勤員
- 基於SSM的職員考勤系統SSM
- YII 初體驗 —— 搭建一個簡單的 Todo List 系統
- 用 PHP 開發一個簡單的以太坊支付系統PHP
- 一個簡單的選單按鈕的實現 (轉)
- 一個簡單的Json轉換器JSON
- 一個簡單的檔案管理程式 (轉)
- 一個最簡單的XML檔案(轉)XML
- 一個簡單的愷撒加密程式 (轉)加密
- 織信OA考勤管理系統是如何解放企業內部考勤的?
- 人臉識別智慧考勤系統開發_人臉識別考勤管理系統開發
- 記《高校考勤系統》小程式(1)
- 記《高校考勤系統》小程式(2)
- EasyUI - 一個簡單的後臺管理系統入門例項UI
- 來來,一起設計一個簡單的活動釋出系統
- 統一身份認證系統的簡單看法
- 紅外人臉考勤點選考勤軟體簡介
- [轉]:如何快速構建一個簡單的程式
- 做一個簡單好看的ViewPager翻轉動畫Viewpager動畫
- 一個簡單的學生成績管理程式 (轉)
- 使用 Fuse 和 java 17 編寫一個簡單的檔案系統Java
- Qmail系統的安裝、簡單配置及使用(轉)AI
- 簡單裝系統打造64位系統萬能映象(轉)
- 配置一個簡單的傳統SSM專案SSM
- 一個用Perl分析Apache Log的簡單程式(轉)Apache
- sql使用cursor寫一個簡單的迴圈<轉>SQL
- 不到40行 Python 程式碼打造一個簡單的推薦系統Python
- [譯] 使用 Pandas 在 Python 中建立一個簡單的推薦系統Python
- 鴻蒙系統應用開發之JS實現一個簡單的List鴻蒙JS
- 用C++編寫一個簡單的員工工資管理系統~C++