一個簡單的考勤系統 (轉)
不考慮加班,請假,外出之類。
原始記錄表:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一個簡簡單單的紅點系統框架框架
- 設計一個簡單的devops系統dev
- JadeClass 考勤管理系統
- 一個簡單的完整人臉識別系統
- 考勤系統+(小專案)
- YII 初體驗 —— 搭建一個簡單的 Todo List 系統
- 用 PHP 開發一個簡單的以太坊支付系統PHP
- 基於SSM的職員考勤系統SSM
- [轉]:如何快速構建一個簡單的程式
- 織信OA考勤管理系統是如何解放企業內部考勤的?
- 人臉識別智慧考勤系統開發_人臉識別考勤管理系統開發
- 統一身份認證系統的簡單看法
- 記《高校考勤系統》小程式(2)
- 記《高校考勤系統》小程式(1)
- 使用 Fuse 和 java 17 編寫一個簡單的檔案系統Java
- [譯] 使用 Pandas 在 Python 中建立一個簡單的推薦系統Python
- 不到40行 Python 程式碼打造一個簡單的推薦系統Python
- 如何簡單的在TF卡上做一個Linux的檔案系統Linux
- 來來,一起設計一個簡單的活動釋出系統
- 配置一個簡單的傳統SSM專案SSM
- 用C++編寫一個簡單的員工工資管理系統~C++
- Springmvc 一個簡單的管理系統 我所遇到的坑1(持續更新)SpringMVC
- 如何使用Access資料庫建立一個簡單MIS管理系統資料庫
- 一個簡單的Tessellation Shader
- 一個簡單的「IOC」例子
- 一個簡單的 PWA 指南
- 鴻蒙系統應用開發之JS實現一個簡單的List鴻蒙JS
- 做一個音影片點播系統要多久?操作越簡單越好
- 基於 Laravel5.5 的簡單個人部落格系統Laravel
- 一款簡單好用的開源文件管理系統
- 簡單查重系統
- 實現一個簡易的響應式系統
- 使用go搭建一個簡易的部落格系統Go
- 一個最簡單的web componentsWeb
- 建立一個簡單的小程式
- 一個簡單的區塊鏈區塊鏈
- 寫一個簡單的 Facade 示例
- 一個簡單的BypassUAC編寫
- 分享一個簡單的redis限流Redis