一个简单的考勤系统

不考虑加班,请假,外出之类。

原始记录表:
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,
 [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: 用函数,原来用游标,不好,后来才改用函数的)

 

时间: 2024-09-28 21:36:45

一个简单的考勤系统的相关文章

怎么用Java编写一个简单的登录系统?可以注册账号的那种

问题描述 怎么用Java编写一个简单的登录系统?可以注册账号的那种 数据库用的是MySQL,但Java操作方面的不知道怎么入手,求大神指点啊,有实例参考就更好了,谢谢 解决方案 import java.awt.event.*; import javax.swing.*; import java.awt.*; import java.awt.Container; import java.util.*; import java.sql.*; class Login extends JFrame im

构建一个简单的CaaS系统_docker

在CaaS系统出现前企业应用架构基本被IaaS/SaaS/PaaS等模式垄断,直到Docker的出现为我们打开了另一个扇大门,废话不说了,我们直奔主题. 我们先了解下一个简单的CaaS系统是如何为用户提供服务的: 企业用户上传它的应用代码或其他代码托管方式,我们生成用户应用的镜像,或者用户直接上传镜像,或者用户直接使用我们提供的基础服务镜像 用户部署他的镜像应用,启动它的镜像容器 用户访问他的应用服务 OK,需求确定了,该搬砖了. 用户镜像制作 既然是一个简单的CaaS系统,我们就不让用户上传代

Linux下一个简单的日志系统的设计及其C代码实现

1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息,包括:变量名称及其值.消息结构定义.函数返回值及其执行情况.脚本执行及调用情况等.通过阅读日志文件,我们能够较快地跟踪程序流程,并发现程序问题.因此,熟练掌握日志系统的编写方法并快速地阅读日志文件,是对一个软件开发工程师的基本要求. 本文详细地介绍了Linux下一个简单的日志系统的设计方法,并给出了其C代码实现.本文为相关开发项目Linux下软

谁有一个简单的邮件收发系统啊

问题描述 小女子正在做邮件收发系统的毕业设计,可是对这方面不是很了解,哪位兄弟姐妹能给我发发一个简单的邮件收发系统,让我学习学习啊,非常感谢啊,我的邮箱是czjwc2005@163.com 解决方案 解决方案二:http://www.verycd.com/topics/239368/自己下吧.

如何构建一个简单的CAAS系统

在CAAS系统出现前企业应用架构基本被IAAS/SAAS/PAAS等模式垄断,直到docker的出现为我们打开了另一个扇大门,废话不说了,我们直奔主题 我们先了解下一个简单的CAAS系统是如何为用户提供服务的 企业用户上传它的应用代码或其他代码托管方式,我们生成用户应用的镜像,或者用户直接上传镜像,或者用户直接使用我们提供的基础服务镜像 用户部署他的镜像应用,启动它的镜像容器 用户访问他的应用服务 OK,需求确定了,该搬砖了. 1. 用户镜像制作 既然是一个简单的CAAS系统,我们就不让用户上传

使用MongoDB和JSP实现一个简单的购物车系统实例_JSP编程

本文介绍了JSP编程技术实现一个简单的购物车程序,具体如下: 1 问题描述 利用JSP编程技术实现一个简单的购物车程序,具体要求如下. (1)用JSP编写一个登录页面,登录信息中有用户名和密码,分别用两个按钮来提交和重置登录信息. (2)编写一个JSP程序来获取用户提交的登录信息并查询数据库,如果用户名为本小组成员的名字且密码为对应的学号时,采用JSP内置对象的方法跳转到订购页面(显示店中商品的种类和单价等目录信息):否则采用JSP动作提示用户重新登录(注:此页面上要包含前面的登录界面). (3

Windows下一个简单的日志系统的C代码实现

       问题描述        实现一个简单的基于Windows的日志系统,要求写入日志文件的内容的样式如下:        [时间]+[文件名]+[日志等级]+日志具体内容        如:        [2015.02.2514:35:13.143][WriteLog.c][INFO]This is a test!        其中,"2015.02.25 14:35:13.143"为当前时间(精确到毫秒),"WriteLog.c"为所打印的日志内容

CodeIgniter创建一个简单的注册系统

CodeIgniter 是一套给 PHP 网站开发者使用的应用程序开发框架和工具包.它提供一套丰富的标准库以及简单的接口和逻辑结构,其目的是使开发人员更快速地进行项目开发.使用 CodeIgniter 可以减少代码的编写量,并将你的精力投入到项目的创造性开发上. CodeIgniter是由Ellislab公司的CEO RickEllis开发的.其核心框架是为这个程序特别编写的,而其他很多类库.辅助函数和子系统则来自于RickEllis和PaulBurdick编写的内容管理系统Expression

一个简单的IM系统(Demo附源码)-- ESFramework 4.0 快速上手(08)

      前面的文章已经介绍完了基于ESFramework/ESPlus进行二次开发的所有要点,现在,我们可以开始小试牛刀了.       本文将介绍使用ESFramework的Rapid引擎开发的两个最简单的Demo,ESFramework.Demos.Simplest 和 ESFramework.Demos.Silverlight.这两个Demo是一个简单的聊天系统,并演示了以下功能: (1)客户端用户上下线时,通知其他在线用户. (2)当客户端与服务端网络断开时,进行自动重连,当网络恢复